Форма для ассоциации комментариев на сообщения

Я пытаюсь создать комментарии, связанные с постами. Есть 3 модели пользователя, микросообщений и комментариев. Вот ассоциации, которые у меня есть:
Модель комментария

class Comment < ActiveRecord::Base
  belongs_to :user 
  belongs_to :micropost

  validates :user_id, presence: true
  validates :micropost_id, presence: true
end

Модель микросообщений

belongs_to :user
  has_many :comments, dependent: :destroy

Модель пользователя

has_many :microposts, dependent: :destroy
  has_many :comments

Я вложил маршрут как:

resources :microposts do 
    resources :comments
  end

Вот мой контроллер комментариев:

class CommentsController < ApplicationController

  def create
    @micropost = Micropost.find(params[:micropost_id])
    @comment = @micropost.comments.build(params[:comment])
    if @comment.save
      flash[:success] = "Comment created"
      redirect_to current_user
    else
      render 'shared/_comment_form'
    end
  end
end

Форма комментария:

<%= form_for([@micropost, @comment]) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Write your message.." %>
  </div>
  <%= f.submit "Post", class: "btn btn-primary" %>
<% end %>

Когда я запускаю это, я получаю форму, я получаю ошибку аргумента,
Первый аргумент в форме не может содержать ноль или быть пустым
Мне интересно, как мне решить эту проблему? Если я просто напишу микросообщение, @comment, похоже, тоже его не распознает, и я получаю неопределенную ошибку локальной переменной. Почему форма комментария не понимает, что микросообщение от контроллера комментариев, чтобы найти micropost_id?

1 ответ

Давайте сначала поймем, как работает эта форма.

Если ваш ресурс имеет определенные ассоциации, например, вы хотите добавить комментарии к микросообщению, учитывая, что маршруты установлены правильно:

<%= form_for([@micropost, @comment]) do |f| %>
 ...
<% end %>

куда @micropost а также @comment определяются перед рендерингом формы.

пример: @micropost = Micropost.find(params[:id]) а также @comment = Comment.new

Позже, когда вы отправляете эту форму (только на этом шаге), ваше действие создания затрагивается вашим контроллером комментариев.

так что в основном то, что вам нужно сделать, это определить @micropost а также @comment перед вызовом form_for

Другие вопросы по тегам