使用嵌套路由与accepts_nested_attributes_for有什么区别?

时间:2012-05-04 12:38:02

标签: ruby-on-rails forms associations nested-attributes

我可能会完全混淆两者,但我发现这些表单可以使用基于嵌套路由的数组参数来促进关联,例如:

<%= form_for [@project, @task]...

或如果父类fields_for是孩子,则使用accepts_nested_nested_attributes_for助手。

这些方法之间有什么区别/权衡?

2 个答案:

答案 0 :(得分:8)

我没有发现答案是如我所希望的那样清晰,所以在做了一些研究之后我发现了一个让我感到满意的答案,所以我想我会与其他人分享。

嵌套路线接近

基本上,当您将子模型的表单作为单个表单呈现时,嵌套路径方法很有用。换句话说,如果你的博客上有一个带有评论模型的Post模型作为它的孩子,你可以使用嵌套的路径来呈现孩子的表单,这样提交该表单就会让rails在关联孩子方面发挥其魔力。与父母一起。

嵌套属性方法

另一方面,accepts_nested_attributes_for方法更适合用于呈现一个表单,该表单在呈现单个表单的外观时,实际上是多个表单与单个提交按钮合并在一起。

总而言之,嵌套路线方法以单一形式处理一个模型(虽然与父模型相关联),而嵌套属性方法处理多个模型以单一形式。

差异可能对新手来说很微妙,但有足够的意义可以理解。

希望这可以帮助那些对此有疑问的人。欢呼声。

答案 1 :(得分:1)

这是儿童模特形式:

<%= form_for [@project, @task] ... %>

您为现有Task提交Project

如果您要更新现有任务,请@project = Project.find(params[:project_id])@task = Task.new根据docs@task = Task.find(params[:id])

这用于父模型表单:

<%= form_for @project do |f| %>
  <%= f.fields_for :task do |builder| %>
    <% # ... %>
  <% end %>
<% end %>

您可以在其中一次创建或更新两个对象。如果您要更新对象,Task属性将通过任务params[:project][:task_attributes]传递。