我正在尝试创建一个表单,该表单允许我为关联输入分组的关联提交新记录。
class Product < AR::Base
has_many :properties
accepts_nested_attributes_for :properties
end请注意,在控制器中为产品构建了一系列属性,因此@product.properties.empty? # => false。
下面的fields_for为我提供了名称为product[properties_attributes][0][value]的正确输入。
= form.fields_for :properties do |pform|
= pform.input :value但是,一旦我尝试对关联进行分组,它就不再生成具有正确名称的输入:
- @product.properties.group_by(&:group_name).each do |group_name, properties|
%h3= group_name
= form.fields_for properties do |pform|
= pform.input :value这将创建name属性类似于product[product_property][value]的输入,而根据第一个示例,它实际上应该是product[property_attributes][0][value]。
Rails文档建议您可以这样做:
= form.fields_for :properties_attributes, properties do |pform|但是这会给出一个错误"undefined method value for Array“。
发布于 2012-08-16 05:14:02
您需要像这样设置:
- @product.properties.group_by(&:group_name).each do |group_name, properties|
%h3= group_name
= form.fields_for :properties, properties do |pform|
= pform.text_field :value它应该工作得很好,因为您已经让accepts_nested_attributes_for :properties rails知道它应该为properties_attributes创建字段。此外,如果您正在使用最新的Rails之一,并且尚未将其添加到模型中,则可能需要添加attr_accessible :properties_attributes ;)
此外,如果您想根据单个属性做出一些决策,您也可以使用以下形式:
- @product.properties.group_by(&:group_name).each do |group_name, properties|
%h3= group_name
- properties.each do |property|
= form.fields_for :properties, property do |pform|
= pform.text_field :value它们在这里都有很好的描述:One-To-Many部分下的http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for
发布于 2012-08-16 02:57:31
我不知道有没有一个干净的“Rails”解决方案来解决这类事情,但我经常会更手动地处理这类情况。eg -在组中循环,并有条件地仅显示特定组中的那些属性。
class Product < AR::Base
has_many :properties
accepts_nested_attributes_for :properties
def group_names
properties.map(&:group_name).uniq.sort
end
end在视图中
- for group_name in product.group_names
= form.fields_for :properties do |pform|
%h3= group_name
- if pform.object.group_name.eql?(group_name)
= pform.input :value这可能会产生一些开销,重复地从product获取属性列表。您可以修改您的has_many :properties关联以按group_name顺序检索属性-然后您可以在%h3是一个新组时添加它。
- previous_group_name = nil
= form.fields_for :properties do |pform|
- if pform.object.group_name != previous_group_name
%h3= pform.object.group_name
= pform.input :value
- previous_group_name = pform.object.group_name给你一些点子。
https://stackoverflow.com/questions/11902248
复制相似问题