【问题标题】:grouping and fields_for分组和fields_for
【发布时间】:2012-08-10 13:03:38
【问题描述】:

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

   class Product < AR::Base
     has_many :properties
     accepts_nested_attributes_for :properties
   end

请注意,在控制器中为产品构建了一系列属性,因此@product.properties.empty? # =&gt; 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|

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

【问题讨论】:

    标签: ruby-on-rails-3 fields-for


    【解决方案1】:

    你需要这样设置:

    - @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 创建字段。此外,您可能需要添加 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 部分下

    【讨论】:

    • 这似乎有效,我不知道为什么我没有尝试:properties 而不是:property_attributes。很快就会接受。
    【解决方案2】:

    我不知道这类事情有一个干净的“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
    

    给你的一些想法......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      相关资源
      最近更新 更多