深深嵌套形式的茧

时间:2013-07-15 14:53:39

标签: ruby-on-rails ruby-on-rails-4 nested simple-form cocoon-gem

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

每一方都应该有多个postal_addressestelecommunications_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_addresseshas_many telecommunications_numbershas_many postal_addresses(此示例和示例应用程序中仅包含electronic_addresses。)

contact_mechanism的每个实例应该只有一个electronic_addresspostal_addresstelecommunications_numberhas_man y关系被选中用于测试,并且一旦嵌套工作,可以稍后更改。)

我想要实现的是嵌套表单,我可以在其中添加多个contact_mechanisms,只需点击几下:

所以我最好有一个电子邮件链接,一个邮政链接和一个电话链接。因此,对于电子邮件,我会有一个cocoon链接,为electronic_addresses添加一个动态表单,包含在contact_mechanisms的表单中,包含在party_contact_mechanisms的表单中。这样,提交表单时将自动设置所有关系。当我使用该设置(聚会中的电子邮件按钮#new)时,提交了以下params_hash,无法创建链接到electronic_address的{​​{1}},链接到contact_mechanims。创建链在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_mechanism的实例没有构建,也没有分配值。所以我需要一种方法来为electronic_address插入一个表单,同时实例化嵌套的party_contact_mechanismcontact_mechanims

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

但是,添加contact_mechanism的嵌套表单的链接未显示。

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

Sample application for this question

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

2 个答案:

答案 0 :(得分:0)

很抱歉没有阅读所有邮件,但首先,据我所知,所有嵌套属性都应该包含" _attributes" postfix in params hash,由accepts_nested_attributes_for添加。

抱歉英文不好。

答案 1 :(得分: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