我想显示一个带有四个嵌套字段集的表单,用于关联对象。我找到的唯一方法是覆盖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
宝石添加(每套至少有一个订单)
每个订单应该总是有四个项目。但是当项目较少时,我不想保存空记录,而是只想将剩余的项目显示为空。
初始化不是在每次创建新的Order
实例时执行的位置,这意味着:在从数据库检索现有订单时也是如此。
伊姆霍的景色也不是最佳的地方。
我会在控制器中解决这个问题:
def new
@order = Order.new
4.times { @order.items.build }
end
然后你就可以保持你的模型/视图原来的样子了。
如果你总是想显示4个嵌套项目,你可以在编辑操作中做类似的事情(最多填充4个)
def edit
@order = Order.find(params[:id])
(@order.items.length...4).each { @order.items.build }
end
在我个人看来,这比在视野中做更干净。
[EDIT:显然这是一个双嵌套形式]
所以,在你的评论中,你澄清了这是一个双嵌套形式,在这种情况下,我会使用如下的:wrap_object选项(如果不提供更多细节,在这里写一个像样的例子会有点困难,所以我保持简短,希望它很清楚)。我猜你有一个"某物"的表格,link_to_add_association
代表:orders
,该订单需要有几个(4)项,所以你可以做一些类似的事情:
= link_to_add_association('add order', f, :orders,
:wrap_object => Proc.new { |order| 4.times { order.items.build}; order })
在视图中,甚至在控制器中的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