【问题标题】:What's the difference between using nested routes vs. accepts_nested_attributes_for?使用嵌套路由与 accept_nested_attributes_for 有什么区别?
【发布时间】:2012-05-04 12:38:01
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    嵌套路由方法

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

    嵌套属性方法

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

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

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

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

    【讨论】:

      【解决方案2】:

      这是子模型表单:

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

      您为现有的Project 提交Task 的位置。

      这里@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 属性将通过任务 id 传入 params[:project][:task_attributes]

      【讨论】:

      • 所以第一个form_for会自动为Task生成带有:project_id的hidden_​​field。对吗?
      • 不。 project_id 将包含在formaction 属性的路径中,并且由于routes.rb 中指定的嵌套路由,将在控制器中被识别
      • 好的,所以第一个 form_for 只需将 poject_id 分配给 url 就像这样 /projecs/:project_id/tasks
      • 所以您是说嵌套路由模式用于在父对象已经存在时创建子对象,而当同时创建父对象和子对象时,accepts_nested_attributes_for 方法最好?更新呢?
      • 完全一样。请参阅我更新的答案。抱歉之前没有提到update
      猜你喜欢
      • 2018-08-01
      • 1970-01-01
      • 2014-06-29
      • 2013-09-23
      • 2023-03-18
      • 2014-09-27
      • 1970-01-01
      • 2020-11-06
      • 2011-01-15
      相关资源
      最近更新 更多