5

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

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

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

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

4

2 回答 2

9

我没有发现给出的答案像我希望的那样清楚,所以在做了更多的研究后,我发现了一个让我满意的答案,所以我想我会与其他人分享。

嵌套路由方法

基本上,当您将子模型的表单呈现为单独的表单时,嵌套路由方法很有用。换句话说,如果您的博客具有 Post 模型和 Comment 模型作为它的孩子,您可以使用嵌套路由为孩子呈现表单,这样提交该表单将使 Rails 在关联孩子方面发挥魔力与父母。

嵌套属性方法

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

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

这种差异对新手来说可能很微妙,但足以理解。

希望这可以帮助其他对此有疑问的人。干杯。

于 2012-05-08T02:09:00.430 回答
1

这是子模型形式:

<%= 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

于 2012-05-04T12:50:13.570 回答