Ruby on Rails 4 fields_for 重复次数

Ruby on Rails 4 fields_for number of repetitions

我想显示一个表单,其中包含四个用于关联对象的嵌套字段集。我发现的唯一方法是覆盖 initialize 方法并定义四个关联:

RUBY

def initialize(attributes = {})
  super
  4.times { items << Item.new }
end

然后正常显示嵌套字段:

HAML

= f.fields_for :items do |item|
  = render 'item_fields', f: item

当我尝试编辑已存在且关联项目数量较少的对象时,这不起作用。

任何帮助将不胜感激。

更多信息:

Order has_many items
OrderSet has_many orders

订单通过cocoon添加gem(每组至少有一个订单)

每个订单应始终有四件商品。但是当项目较少时,我不想保存空记录,而是希望将剩余项目显示为空。

在您 f.fields_for 在您的视图中,甚至在您的控制器中,您可以检查 .items() 的长度并根据需要创建新对象:

(o.items.length...4).each { f.object.items << Item.new}
= f.fields_for :items do |item|
 = render 'item_fields', f: item

初始化不是每次创建新的 Order 实例时执行的地方,这意味着:也在从数据库中检索现有订单时。

恕我直言,风景也不是最佳位置。

我会在控制器中解决这个问题:

def new
  @order = Order.new
  4.times { @order.items.build }
end

然后您就可以将 model/view 保持原样。

如果你总是想显示 4 个嵌套项目,你可以在编辑操作中做类似的事情(最多填充 4 个)

def edit
  @order = Order.find(params[:id])
  (@order.items.length...4).each { @order.items.build }
end

在我个人看来,这比在视图中这样做更干净。

[编辑:显然这是一个双重嵌套形式]

所以,在你的评论中你澄清了它是一个双重嵌套形式,在那种情况下,我会使用 :wrap_object 选项如下(在这里写一个像样的例子有点困难,没有你提供更多细节,所以我保持简短并希望它清楚)。我猜你有一个 "something" 的表格,:orders 有一个 link_to_add_association,并且该订单需要有几 (4) 个项目,所以你可以这样做:

= link_to_add_association('add order', f, :orders,
:wrap_object => Proc.new { |order| 4.times { order.items.build}; order })