我正在尝试创建与帖子相关的评论。有3种型号用户,微博和评论。
以下是我的关联:
评论模型
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :micropost
validates :user_id, presence: true
validates :micropost_id, presence: true
end
Microposts模型
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 %>
当我运行这个时,我得到一个表格,我得到一个参数错误,
表单中的第一个参数不能包含nil或为空
我想知道如何解决这个问题?如果我只是编写微博,那么@comment似乎也无法识别它,我得到一个 未定义的局部变量错误。
为什么评论形式没有意识到微博是来自评论控制器来找到micropost_id?
答案 0 :(得分:1)
让我们先了解这个表单是如何工作的。
如果您的资源已定义关联,例如,您希望在给定路由设置正确的情况下向微博添加注释:
<%= form_for([@micropost, @comment]) do |f| %>
...
<% end %>
在呈现表单之前定义@micropost
和@comment
。
示例:@micropost = Micropost.find(params[:id])
和@comment = Comment.new
稍后当您提交此表单时(仅在该步骤中),您的评论控制器会触摸您的创建操作。
基本上你需要做的是在调用form_for之前定义@micropost
和@comment