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 })
我想显示一个表单,其中包含四个用于关联对象的嵌套字段集。我发现的唯一方法是覆盖 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 })