我正在遵循Ruby on Rails指南,有些事情我不理解。我有一个名为Comment
的模型,其中belongs_to
还有另外两个模型,分别为User
和Book
。
此模型的控制器Comments
具有以下create
操作:
def create
book = Book.find(params[:comment][:book_id])
comment = book.comments.build(comment_params)
comment.user = current_user
if comment.save
redirect_to comment.book
end
end
comment_params
就是这样:
def comment_params
params.require(:comment).permit(:body)
end
在此表单中单击“提交”按钮时,将调用此create
操作,该按钮是位于_comments
视图文件夹中并呈现在书籍的{ {1}}动作:
books
show
实际上是在<%= form_for @book.comments.build do |f| %>
<%= f.hidden_field :book_id, value: @book.id %>
<%= f.text_area :body %>
<%= f.submit "Submit" %>
<% end %>
中定义的。
我不明白为什么我必须将@book
参数传递给books#show
方法才能找到这本书。我以为[:comment]
就足够了。
答案 0 :(得分:3)
您实际上并没有传递:comment
参数,而是访问嵌套在:book_id
哈希中的:comment
。您的params
类似于:
{
:comment => {
:book_id => 1
}
}
如果您简单地通过了params[:book_id]
,您将得到nil
。
答案 1 :(得分:2)
如果book_id
是comments
表中的一个字段,则无需检索该书。随便
def create
comment = Comment.new(comment_params)
comment.user = current_user
if comment.save
redirect_to comment.book
end
end
此外,如果User
模型具有comments
关联,并且在此操作中您确定设置了current_user
,则可以进行
def create
comment = current_user.comments.build(comment_params)
if comment.save
redirect_to comment.book
end
end