用于自联接的嵌套表单和路由帮助程序?



我可以将操作视图表单帮助程序指南 (https://guides.rubyonrails.org/form_helpers.html#nested-forms( 中给出的示例(嵌套表单(转录为嵌套表单,以及路由指南 (https://guides.rubyonrails.org/routing.html#nested-resources( 中给出的嵌套资源示例转换为关联指南 (https://guides.rubyonrails.org/association_basics.html#self-joins( 中所述的自联接案例

自加入

class Employee < ApplicationRecord
has_many :subordinates, class_name: "Employee",
foreign_key: "manager_id"
belongs_to :manager, class_name: "Employee", optional: true
end

嵌套表单帮助程序示例

<%= form_with model: @person do |f| %>
Addresses:
<ul>
<%= f.fields_for :addresses do |addresses_form| %>
<li>
<%= addresses_form.label :kind %>
<%= addresses_form.text_field :kind %>
<%= addresses_form.label :street %>
<%= addresses_form.text_field :street %>
...
</li>
<% end %>
</ul>
<% end %>

嵌套路由帮助程序示例

resources :magazines do
resources :ads
end

在路由或表单方面,自加入和任何其他类型的组合之间完全没有区别。

您的路线实际上根本不关心您的模型*。它们只是声明一组路由规则,这些规则将传入的请求与控制器匹配。所以他们更不关心你的主张。你可以随心所欲地声明你的 RESTful 路由,而你作为一个程序员实际上决定了它如何与你的模型相对应。表是自联接的这一事实是一个实现细节,实际上与您应该如何构建应用程序无关。

你的表格也根本不在乎。当您使用f.fields_for :subordinates时,它只是在模型上调用subordinates方法并循环访问它。它不知道也不关心基础表。这同样适用于accepts_nested_attributes.这就是协会提供的抽象的意义所在。

最新更新