深深嵌套的茧

Posted

技术标签:

【中文标题】深深嵌套的茧【英文标题】:cocoon in a deeply nested form 【发布时间】:2013-07-13 11:50:40 【问题描述】:

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

每一方应该可以有多个postal_addressestelecommunications_numberselectronic_addresses

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

为此:

partyhas many communication_mechanisms :through => party_contact_mechanisms

party_contact_mechanismbelongs_to partybelongs_to contact_mechanism

contact_mechanismhas_many electronic_addresseshas_many telecommunications_numbershas_many postal_addresses(此示例和示例应用程序中仅包含电子地址。)

contact_mechanism 的每个实例应该只有一个electronic_addresspostal_addresstelecommunications_number。选择has_many 关系进行测试,稍后将在嵌套工作后更改。)

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

所以我最好有一个电子邮件链接、一个邮政链接和一个电话链接。所以对于电子邮件,我将有一个茧链接来为electronic_addresses 添加一个动态表单,包裹在contact_mechanisms 的表单中,包裹在party_contact_mechanisms 的表单中。这样,在提交表单时,所有关系都会自动设置。当我使用该设置(party#new 中的电子邮件按钮)时,提交了以下 params_hash,未能创建链接到 contact_mechanimselectronic_address,链接到 party_contact_mechanism。创建链在party_contact_mechanims 处中断,创建时使用party_id 但没有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

实现此表单的第二种可能性是遵循 cocoon 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 上有一个示例应用程序供审核:

Sample application for this question

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

【问题讨论】:

【参考方案1】:

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

抱歉英语不好。

【讨论】:

【参考方案2】:

在您的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

【讨论】:

以上是关于深深嵌套的茧的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis框架学习笔记 --- [懒加载配置 应用到嵌套查询]

如何编写带有图标的茧删除链接

html的标签嵌套规则

RecyclerView和ScrollView嵌套使用

关于几个标签嵌套问题

vb怎么窗体嵌套