我可能完全混淆了这两者,但我看到表单可以使用基于嵌套路由的数组参数来促进关联,例如:
<%= form_for [@project, @task]...
或者fields_for
如果父类accepts_nested_nested_attributes_for
是孩子,则使用帮助器。
这些方法之间有什么区别/权衡?
我可能完全混淆了这两者,但我看到表单可以使用基于嵌套路由的数组参数来促进关联,例如:
<%= form_for [@project, @task]...
或者fields_for
如果父类accepts_nested_nested_attributes_for
是孩子,则使用帮助器。
这些方法之间有什么区别/权衡?
我没有发现给出的答案像我希望的那样清楚,所以在做了更多的研究后,我发现了一个让我满意的答案,所以我想我会与其他人分享。
嵌套路由方法
基本上,当您将子模型的表单呈现为单独的表单时,嵌套路由方法很有用。换句话说,如果您的博客具有 Post 模型和 Comment 模型作为它的孩子,您可以使用嵌套路由为孩子呈现表单,这样提交该表单将使 Rails 在关联孩子方面发挥魔力与父母。
嵌套属性方法
另一方面,accepts_nested_attributes_for 方法更适合用于呈现一个表单,该表单虽然具有单个表单的外观,但实际上是多个表单与单个提交按钮合并在一起。
总而言之,嵌套路由方法以单一形式处理一个模型(尽管与父模型相关联),而嵌套属性方法以单一形式处理多个模型。
这种差异对新手来说可能很微妙,但足以理解。
希望这可以帮助其他对此有疑问的人。干杯。
这是子模型形式:
<%= form_for [@project, @task] ... %>
您Task
提交的现有Project
.
在这里@project = Project.find(params[:project_id])
并@task = Task.new
根据文档,或者@task = Task.find(params[:id])
如果您正在更新现有任务。
这在父模型表单中使用:
<%= form_for @project do |f| %>
<%= f.fields_for :task do |builder| %>
<% # ... %>
<% end %>
<% end %>
您可以在其中一次创建或更新两个对象。如果您要更新对象Task
,属性将在params[:project][:task_attributes]
with 任务中传递。id