5

我正在尝试创建一个表单,该表单允许我为关联输入分组的关联提交新记录。

   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|

但这给出了一个错误“数组的未定义方法值”。

4

2 回答 2

7

你需要这样设置:

- @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 :propertiesrails 知道它应该为properties_attributes. attr_accessible :properties_attributes此外,如果您使用的是最新的 Rails 之一并且尚未将其添加到模型中,则可能需要添加 ;)

此外,如果您想根据单个属性做出一些决定,您也可以使用以下表格:

- @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

它们都在这里得到很好的描述:http: //api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_forOne-To-Many部分下

于 2012-08-15T21:14:02.190 回答
1

我不知道这类事情有一个干净的“Rails”解决方案,但我经常更手动地处理这些类型的情况。例如 - 遍历组并有条件地仅显示特定组中的那些属性。

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

重复从产品中获取属性列表可能会有一点开销。您可以修改您的 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

给你一些想法...

于 2012-08-15T18:57:31.350 回答