не может быть решен Первый аргумент в форме не может содержать ноль или быть пустым - PullRequest
0 голосов
/ 17 апреля 2020

Что я хочу

В настоящее время я реализую функцию комментирования в приложении, которое имитирует Instagram. Я хотел бы отобразить список комментариев и форму отправки комментариев непосредственно на экране списка сообщений.

Ошибка

ArgumentError in MainPage#main
First argument in form cannot contain nil or be empty

Соответствующий исходный код

Вот некоторые код, который вам может понадобиться

main_page_controller.rb

class MainPageController < ApplicationController
  def main
    if logged_in?
      @micropost = current_user.microposts.build
      @feed_items = current_user.feed.paginate(page: params[:page])
    end
  end
end

micropost.rb

class Micropost < ApplicationRecord
  belongs_to :user
  has_many :likes, dependent: :destroy
  has_many :love_users, through: :likes, source: :user
  has_many :comments, dependent: :destroy
  default_scope -> { order(created_at: :desc) }
  mount_uploader :picture, PictureUploader
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 200 }
  validates :picture, presence: true
  validate  :picture_size

  def love(user)
    likes.create(user_id: user.id)
  end

  def unlove(user)
    likes.find_by(user_id: user.id).destroy
  end

  def love?(user)
    love_users.include?(user)
  end

  private

    def picture_size
      if picture.size > 5.megabytes
        errors.add(:picture, "画像サイズを5MB以下にしてください")
      end
    end
end

comment.rb

class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :micropost
  validates :content, presence: true
  validates :user_id, presence: true
end

microposts_controller. rb

class MicropostsController < ApplicationController
  before_action :logged_in_user, only: [:create, :destroy]
  before_action :correct_user, only: :destroy

  def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = "投稿しました"
      redirect_to root_url
    else
      @feed_items = []
      render 'new'
    end
  end

  def destroy
    @micropost.destroy
    flash[:success] = "投稿を削除しました"
    redirect_to request.referrer || root_url
  end

  def new
    @micropost = current_user.microposts.build if logged_in?
  end

  def show 
    @micropost = Micropost.find(params[:id])
    @comment = Comment.new
    @user = User.find_by(id: @micropost.user_id)
  end

  private

    def micropost_params
      params.require(:micropost).permit(:content, :picture)
    end

    def correct_user
      @micropost = current_user.microposts.find_by(id: params[:id])
      redirect_to root_url if @micropost.nil?
    end
end

comments_controller.rb

class CommentsController < ApplicationController
  def create
    @micropost = Micropost.find(params[:micropost_id])
    @comment = @micropost.comments.build(comment_params)
    @comment.user = current_user
    if @comment.save
      flash[:success] = "投稿しました"
      redirect_to root_url
    else
      flash.now[:danger] = "投稿できませんでした"
      redirect_to root_url
    end
  end

  def destroy
    @comment = Comment.find_by(id: params[:id])
    @comment.destroy
    redirect_to root_url
  end

  private 

    def comment_params
      params.require(:comment).permit(:content)
    end
end

микросообщений. html .erb

<li id="micropost-<%= micropost.id %>" data-micropost-id="<%= micropost.id %>">
  <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %>
  <%= link_to micropost.user.name, micropost.user %>
  <span class="content">
    <%= micropost.content %>
    <%= image_tag micropost.picture.url if micropost.picture? %>
  </span>
  <span class="timestamp">
    <%= time_ago_in_words(micropost.created_at) %>前に投稿
    <% if current_user?(micropost.user) %>
      <%= link_to "削除", micropost, method: :delete, data: { confirm: "削除してもよろしいですか?" } %>
    <% end %>
  </span>
  <%= render "likes/like", micropost: micropost %>
  <div class="comment_index">
    <% @micropost.comments.each do |comment| %>
      <%= link_to comment.user.name, comment.user %>
      <%= comment.content %>
      <span class="delete">
        <%= link_to "削除", [@micropost, comment], method: :delete if current_user?(comment.user) %>
      </span>
    <% end %>
  </div>
  <div class="comment-form">
    <%= form_for([@micropost, @comment]) do |f| %>
      <%= render 'shared/error_messages', object: f.object %>
      <div class="field">
        <%= f.text_area :body, placeholder: "コメントを入力" %>
      </div>
      <%= f.submit "投稿", class: "btn btn-primary" %>
    <% end %>
  </div>
</li>

rout.rb

Rails.application.routes.draw do
  get 'likes/create'
  get 'likes/destroy'
  get 'sessions/new'
  root 'main_page#main'
  get '/signup', to: 'users#new'
  get '/login', to: 'sessions#new'
  post '/login', to: 'sessions#create'
  delete '/logout', to: 'sessions#destroy'
  get '/newpost', to: 'microposts#new'
  resources :users do
    member do
      get :following, :followers
    end
  end
  resources :microposts, only: [:create, :destroy] do
    resources :comments, only: [:create, :destroy]
  end
  resources :relationships, only: [:create, :destroy]
  resources :testsessions, only: :create
  resources :likes, only: [:create, :destroy]
end

проба

В сообщении об ошибке говорится, что первый аргумент либо нулевой, либо пустой, но Mainpage # main определяет @micropost. Я также пытался создать данные микросообщений в консоли, и это работало нормально. Я искал возможные факторы, но они не разрешили.

дополнение

Я использую рельсы (6.0.2.1) Я задал тот же вопрос, но не получил ответов. https://teratail.com/questions/254164

Я прочитал

Первый аргумент в форме не может содержать ноль или быть пустым - Rails 4

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Ранее я пытался отображать комментарии и формы отправки комментариев непосредственно на странице списка сообщений, но я реализовал это, создав отдельную страницу отображения микросообщений и отобразив их там.

0 голосов
/ 17 апреля 2020

Попробуйте заменить

form_for([@micropost, @comment])

на

form_for([@micropost, Comment.new])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...