【问题标题】:Ruby on Rails 4 fields_for number of repetitionsRuby on Rails 4 fields_for 重复次数
【发布时间】:2015-04-06 12:36:43
【问题描述】:

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

红宝石

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 添加订单(每组至少有一个订单)

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

【问题讨论】:

    标签: ruby-on-rails ruby fields-for


    【解决方案1】:

    initialize 不是每次创建新的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
    

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

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

    因此,在您的评论中,您澄清了它是一种双嵌套形式,在这种情况下,我将使用: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 })
    

    【讨论】:

    • 不幸的是,这是不可能的,因为Orderitems 的父模型,它被进一步嵌套,因此它永远不会执行new 动作。更准确地说,orders 是由 cocoon gem 动态添加的(非常感谢 gem)给它的父模型让我们说 OrdersSet
    • 就我而言coocon 仅根据模板生成字段,但我可能错了。
    • 在这种情况下,您应该使用:wrap_object 选项。查看我所做的编辑。
    • 这看起来很有希望。我会在将其应用到我的代码后报告。
    • 非常感谢。这个:wrap_object 为我提供了解决此问题所需的所有功能。
    【解决方案2】:

    在视图中的 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
    

    【讨论】:

    • 谢谢。这很好,但我可能会坚持使用@nathanvda 的答案,因为最后我将他的cocoon gem 用于此表单。
    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 2011-09-30
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2012-07-05
    • 2018-05-25
    相关资源
    最近更新 更多