具有活动管理员的 Rails 双嵌套表单

Posted

技术标签:

【中文标题】具有活动管理员的 Rails 双嵌套表单【英文标题】:Rails double nested form with active admin 【发布时间】:2021-12-29 16:59:00 【问题描述】:

我的关联如下:

variant has_may 颜色和颜色 has_many 大小。我正在使用活动管理 gem 来管理后端活动。我的模型看起来像,

class Variant < ApplicationRecord

  has_many :variant_colours, dependent: :destroy

  accepts_nested_attributes_for : variant_colours, allow_destroy: true
end

class VariantColor < ApplicationRecord
  belongs_to :variant

  has_many :variant_sizes, dependent: :destroy

  accepts_nested_attributes_for :variant_sizes, allow_destroy: true
end

class VariantSize < ApplicationRecord
  belongs_to :variant_color
end

它正在构建具有给定字段的 variant_colours 表单,但它不是在变体颜色下构建 variant_sizes 表单。构建意味着它不会填充表单(UI)上的字段

form do |f|
    f.inputs do
      f.input :name
      f.input :product
      f.input :sku
      f.input :stock_quantity
      f.inputs do
        f.has_many :variant_colors, heading: 'Variant Colors',
                                allow_destroy: true,
                                new_record: true do |color_form|
          color_form.input :color
          color_form.input :sku_code
          color_form.input :stock
          color_form.inputs do
            color_form.has_many :variant_sizes, heading: 'Variant Sizes',
                                    allow_destroy: true,
                                    new_record: true do |size_form|
              size_form.input :size
              size_form.input :sku_code
              size_form.input :stock
            end
          end
        end
      end
    end
    f.actions
  end

【问题讨论】:

【参考方案1】:

可能不需要用任何东西包装f.has_many,因此您可以尝试删除嵌套的f.inputscolor_form.inputs 中的一个或两个,您已经将has_many 输入块包装在表单中。

我的下一个想法是,您如何在控制器中声明允许的参数?它们可能需要类似于以下内容:

permit_params :name, :product, :sku, :stock_quantity, 
  variant_colors_attributes: [
    :color, :sku_code, :stock, :_destroy, 
    # I don't think I've ever tried to double nest in this way, you may need diff syntax
    variant_sizes_attributes: [:size, :sku_code, :stock, :_destroy]
  ]

我的猜测是问题出在您允许的参数中。

【讨论】:

对不起,我没有正确解释。实际上它并没有填充表单本身的字段。 您是否尝试过删除或注释掉要嵌套这些输入的 color_form.inputs do 包装器?另外,VariantSize 不应该属于 Variant(不是 VariantColor)吗?我想不出一个颜色对象应该有一个与之关联的大小的原因。 TBH 因为两个模型的属性相同,我想知道为什么它们不是使用 STI 的单个超类的不同子类型。 对于您现在拥有的模型,您可能还需要在 Variant 和 has_one :variant, through: :variant_color 中添加类似 has_many :variant_sizes, through: :variant_colours 的内容 在注释掉 color_form.inputs 后工作 谢谢你的帮助@Allison

以上是关于具有活动管理员的 Rails 双嵌套表单的主要内容,如果未能解决你的问题,请参考以下文章

单表继承 活动管理模型映射问题 rails 4

活动管理员设计用户:无密码更新

选择表单内的活动管理员 has_one 重复

如何在 Rails 2.3.8 中使用带有关联的 Active 脚手架列出活动记录?

具有多个嵌套模型的 Rails 表单会导致无线电组出现问题

具有连接表关系的活动管理员