我对使用表单创建每条评论的Rails Guide感到困惑。从docs开始,我知道您通常将模型对象名称作为form_for
的第一个参数传递,但@article.comments.build
如何工作? Rails如何知道为每篇属于文章的评论构建表单?文档不能解释与下面相符的签名 -
<%= form_for([@article, @article.comments.build]) do |f| %>
答案 0 :(得分:0)
来自Getting Started with Rails Tutorial:
<%= form_for([@article, @article.comments.build]) do |f| %>
<p>
<%= f.label :commenter %><br>
<%= f.text_field :commenter %>
</p>
<p>
<%= f.label :body %><br>
<%= f.text_area :body %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
这会在Article show页面上添加一个表单,该表单通过调用CommentsController创建操作来创建新注释。这里的form_for调用使用一个数组,它将构建一个嵌套路由,例如/ articles / 1 / comments。
所以,它使用数组作为form_for
中的第一个参数,上面的部分也解释了它将构建一个像/articles/1/comments
这样的嵌套路由来告诉你的CommentsController
该评论应该在哪篇文章上创建。
答案 1 :(得分:0)
此处为routes
和controller
的完整角色。让我们从开始看:
你的路线说:
resources :articles do
resources :comments
end
所以要创建comments
,您的路线就像:/articles/1/comments
所以这表示comment
适用于Article
id: 1
。
现在,在您的控制器中,您的create
操作就像这样:
def create
@article = Article.find(params[:article_id])
@comment = @article.comments.create(comment_params)
redirect_to article_path(@article)
end
所以在这里你可以看到我们正在使用来自@article
的{{1}}找到params[:article_id]
。因此,这将返回1,url
将@article
的对象与Article
对齐。然后在下一行中,您将创建id: 1
,如下所示:
@comment
因此,这将创建属于@comment = @article.comments.create(comment_params)
Comment
的{{1}}。
现在谈论Article
以及你的怀疑:
id: 1
这没有任何效果,只会创建form_for
,该<%= form_for([@article, @article.comments.build]) do |f| %>
将提交到form
article/:id/comments
请求的所需网址。因此,当您点击此路线时,它会确定您需要为POST
创建此Comment
。
如果你有这样的路线:
Article
然后resources :comments
create
你将会遇到Comment
路由,它永远不会知道它属于/comments
,直到您明确发送Article
为止