Ruby on Rails 4字段_表示重复次数



我想显示一个带有四个嵌套字段集的表单,用于关联对象。我找到的唯一方法是覆盖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

相关内容

  • 没有找到相关文章

最新更新