1

我想在项目中使用带有 rails 4.0 的 cocoon 来实现深度嵌套的表单。我有一个派对模型,它可以与一个人或一个组织相关联(为了简单起见,这里不包括,所以派对只有它的主键)。

每一方应该能够有多个postal_addresses,telecommunications_numberselectronic_addresses.

这些中的每一个都可以在多方之间共享

为此:

party has many communication_mechanisms :through => party_contact_mechanisms

party_contact_mechanism belongs_to partybelongs_to contact_mechanism

contact_mechanism has_many electronic_addresses,has_many telecommunications_numbershas_many postal_addresses(此示例和示例应用程序中仅包含电子地址。)

(每个实例contact_mechanism应该只有一个electronic_address,postal_addresstelecommunications_numberhas_man选择 y 关系进行测试,一旦嵌套工作将在稍后更改。)

我想要实现的是一个嵌套表单,我可以contact_mechanisms通过尽可能少的点击添加多个表单:

所以最好我有一个电子邮件链接、一个邮政链接和一个电话链接。因此,对于电子邮件,我将有一个茧链接来添加一个动态表单 for electronic_addresses,包裹在一个表单中,contact_mechanisms包裹在一个表单中party_contact_mechanisms。这样,在提交表单时,所有关系都会自动设置。当我使用该设置(party#new 中的电子邮件按钮)时,提交了以下 params_hash,无法创建electronic_address链接到 a 的contact_mechanims链接到 a party_contact_mechanism。创建链在 处中断party_contact_mechanims,创建时使用 aparty_id但没有 a contact_mechanism_id

Parameters: {"utf8"=>"✓", "authenticity_token"=>"pyT1zgKlRBJgtBC/LGCNEaOcsPZxlmc5zEO3xd/THlg=", "party"=>{"party_contact_mechanisms_attributes"=>{"1373896051610"=>{"from_date(1i)"=>"2013", "from_date(2i)"=>"7", "from_date(3i)"=>"15", "thru_date(1i)"=>"2013", "thru_date(2i)"=>"7", "thru_date(3i)"=>"15", "contact_mechanisms"=>{"electronic_addresses"=>{"electronic_address_string"=>"juergen.helmers@gmail.com"}}}}}, "commit"=>"Save"}

似乎contact_mechanismelectronic_address没有得到构建的实例,也没有分配任何值。所以我需要一种方法来插入一个表单party_contact_mechanism并同时实例化嵌套的contact_mechanimselectronic_address

实现此表单的第二种可能性是遵循茧 wiki 示例中的 belongs_to 关系(https://github.com/nathanvda/cocoon/wiki/A-guide-to-doing-nested-model-forms#the-look-up -or-create-belongs_to)并且可以使用“PCM”按钮进行测试。使用这种方法,首先单击以添加party_contact_mechanism表单,然后选择现有的contact_mechanism或再次单击以创建新的contact_mechanism.

contact_mechanism但是没有显示添加嵌套表单的链接。

我在 github 上有一个示例应用程序供审查:

此问题的示例应用程序

非常感谢有关如何最好地实现此数据模型的任何帮助。

4

2 回答 2

0

抱歉,没有阅读所有消息,但首先,据我所知,所有嵌套属性都应该在 params 哈希中具有“_attributes”后缀,由 accept_nested_attributes_for 添加。

抱歉英语不好。

于 2013-08-06T08:56:33.707 回答
0

在您的link_to_add_association身上,您可以使用该wrap_object选项来建立任何额外的关联。如果您使用fields_for这些关联,则需要一个新实例。

例如,在您的情况下,如果您想出contact_mechanism现在表单中,您必须像这样调用助手:

# I'm using a helper because code looks messy in the view
def link_to_add_party_contact_mechanism(form)
  wrap_object = proc do |party_contact_mechanism|
    party_contact_mechanism.build_contact_mechanism
    party_contact_mechanism
  end

  link_to_add_association "Add...", form, :party_contact_mechanisms, wrap_object: wrap_object
end
于 2017-06-04T11:13:41.427 回答