如何创建嵌套的多态表单并控制为父级和子级呈现的子记录

时间:2012-04-26 15:43:30

标签: ruby-on-rails-3 forms nested polymorphism

我使用的模型是Merchant,Address,Phone,&联系。关系如下:

商人:

has_many :phones, :as => :phoneable, :dependent => :destroy
has_many :addresses, :as => :addressable, :dependent => :destroy
has_many :contacts, :as => :entity, :dependent => :destroy

联系人:

has_many :phones, :as => :phoneable, :dependent => :destroy
has_many :addresses, :as => :addressable, :dependent => :destroy

我有一个表单,可以创建一个包含两个地址记录和许多电话记录的父记录。我的商家控制器新方法有这个设置代码:

@merchant.addresses.build (:address_type => "Dba")
@merchant.addresses.build (:address_type => "Mailing")
@merchant.phones.build (:phone_type => "Business")
@merchant.phones.build (:phone_type => "Fax")

实际表格有;

<%= f.fields_for :addresses do |a| %>

表示商家的两个地址,并且;

<%= f.fields_for :phones do |p| %>

商家的电话记录。

我遇到的问题是添加联系人的地址和电话记录;

<%= f.fields_for :contacts do |c| %>
<%= f.fields_for :addresses do |a| %>
<%= f.fields_for :phones do |p| %>

为每个联系人记录呈现两个地址和电话。

我只想要商家记录的两个地址。我如何获得这两个地址.build&amp; phones.build只为父级创建记录,只构建一个地址&amp;每个联系人的电话记录(将通过链接动态添加到表单中)?

1 个答案:

答案 0 :(得分:0)

一种方法是在商家显示器上进行“新”操作,该表单显示用户要填写的两个地址。此表单的提交操作将创建商家。它还会有一个“添加联系人”的链接,这将显示另一种创建联系人的表单。联系人的“新”表格应显示一个地址和一个电话号码,供用户填写。