Rails' form_for使用嵌套资源?

时间:2017-01-17 08:25:39

标签: ruby-on-rails

我对使用表单创建每条评论的Rails Guide感到困惑。从docs开始,我知道您通常将模型对象名称作为form_for的第一个参数传递,但@article.comments.build如何工作? Rails如何知道为每篇属于文章的评论构建表单?文档不能解释与下面相符的签名 -

<%= form_for([@article, @article.comments.build]) do |f| %>

2 个答案:

答案 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)

此处为routescontroller的完整角色。让我们从开始看:

你的路线说:

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为止