我有一个Rails 3.2项目,其中:
Product has_many Descriptions
这些Descriptions
有一个description_type
和一个language_code
。不同类型的Products
可以有不同类型和数量的Descriptions
,因此类型为"目录will have 4 different Descriptions, where a product of type
批发"的Product
将只有2个。
在创建Product
之后,after_create
方法为产品创建不同的descriptions
,只填充description_type
。这个想法是,用户然后进入并填写不同的描述值。
现在我在这种情况下,我必须动态地建立一些复杂的形式与不同数量的描述,然后通过控制器传递所有这些描述值到Product
或Description
上的一些类方法来持久化数据,它只是结束了意大利面无处不在。
是否有一些模式,我可以应用到嵌套这些子属性在现有表单的问题域?我必须在编辑上这样做,因为我不知道要创建多少字段,直到选择product_type
。同样,我愿意用完全不同的方式来做这件事。
就在今天,我不得不在我们的应用程序中重建一个成员表单,其中Member
属于User
,其中有许多PhoneNumber
s。
Member
型号accepts_nested_attributes_for :user
和User
型号accepts_nested_attributes_for :phone_numbers
使用茧宝石,我可以在我的成员表单中执行以下操作:
# phone number fields in members/_form.html.haml
# if you do use this on a new (know you said edit but just in case) ... be sure to instantiate the association
# in my case: @member.user.phone_numbers.build
# u represents the User part of the form ... typically 'f'
= u.simple_fields_for :phone_numbers do |phone|
= render 'users/phone_number_fields', f: phone
.add-phone-link-wrapper.pull-right
= link_to_add_association 'Add Phone', u, :phone_numbers, class: 'btn btn-orange btn-mini add-remove-links', partial: 'users/phone_number_fields', render_options: { wrapper: 'bootstrap' }
# 'users/phone_number_fields' partial
.nested-fields
= f.input :phone
= f.input :phone_label, as: :select, collection: PhoneNumber::LABELS
= f.input :display_number, as: :boolean
= link_to_remove_association 'Remove Phone', f, class: 'btn btn-red btn-mini add-remove-links pull-right', render_options: { wrapper: 'bootstrap' }
注意:我使用SimpleForm和cocoon在实现上有一些差异,这取决于你的表单构建器(都在他们的github页面/wiki上)。
对于我们的需要,这完全符合。