首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分组和fields_for

分组和fields_for
EN

Stack Overflow用户
提问于 2012-08-10 21:03:38
回答 2查看 1K关注 0票数 5

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

代码语言:javascript
复制
   class Product < AR::Base
     has_many :properties
     accepts_nested_attributes_for :properties
   end

请注意,在控制器中为产品构建了一系列属性,因此@product.properties.empty? # => false

下面的fields_for为我提供了名称为product[properties_attributes][0][value]的正确输入。

代码语言:javascript
复制
= form.fields_for :properties do |pform|                                                                                                                               
  = pform.input :value

但是,一旦我尝试对关联进行分组,它就不再生成具有正确名称的输入:

代码语言:javascript
复制
- @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文档建议您可以这样做:

代码语言:javascript
复制
= form.fields_for :properties_attributes, properties do |pform|

但是这会给出一个错误"undefined method value for Array“。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-16 05:14:02

您需要像这样设置:

代码语言:javascript
复制
- @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 ;)

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

代码语言:javascript
复制
- @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

票数 7
EN

Stack Overflow用户

发布于 2012-08-16 02:57:31

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

代码语言:javascript
复制
class Product < AR::Base
  has_many :properties
  accepts_nested_attributes_for :properties

  def group_names
    properties.map(&:group_name).uniq.sort
  end
end

在视图中

代码语言:javascript
复制
- 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是一个新组时添加它。

代码语言:javascript
复制
- 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

给你一些点子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11902248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档