查找方法中的参数

时间:2019-03-22 13:18:45

标签: ruby-on-rails

我正在遵循Ruby on Rails指南,有些事情我不理解。我有一个名为Comment的模型,其中belongs_to还有另外两个模型,分别为UserBook

此模型的控制器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]就足够了。

2 个答案:

答案 0 :(得分:3)

您实际上并没有传递:comment参数,而是访问嵌套在:book_id哈希中的:comment。您的params类似于:

{
  :comment => {
    :book_id => 1
  }
}

如果您简单地通过了params[:book_id],您将得到nil

答案 1 :(得分:2)

如果book_idcomments表中的一个字段,则无需检索该书。随便

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