Форма для ассоциации комментариев на сообщения
Я пытаюсь создать комментарии, связанные с постами. Есть 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