ActiveAdmin与has_many形成多个嵌套HMT关系

时间:2016-02-19 12:22:07

标签: ruby-on-rails activeadmin has-many

我是ActiveAdmin和Rails的新手,我在努力建立我的ActiveAdmin界面。

考虑以下模型:

class PageType < ActiveRecord::Base
  has_many :fields, class_name: 'PageField'
  accepts_nested_attributes_for :fields, allow_destroy: true
end


class PageField < ActiveRecord::Base
  belongs_to :page_type
  has_many :page_has_fields
  has_many :pages, through: :page_has_fields

  accepts_nested_attributes_for :page_has_fields, allow_destroy: true
end

class PageHasField < ActiveRecord::Base
  belongs_to :page
  belongs_to :page_field
end

class Page < ActiveRecord::Base
  belongs_to :page_type
  has_many :page_has_fields, dependent: :delete_all
  has_many :page_fields, through: :page_has_fields

  accepts_nested_attributes_for :page_fields, allow_destroy: true
end

在Active Admin中我想创建一些页面模板来处理“静态”页面。在每个页面中,我想更新与模板页面相关的每个字段的内容。

到目前为止,我使用此代码做了什么:

ActiveAdmin.register Page do

  permit_params :name, :page_type_id, :page_id,
                :page_fields_attributes => [:id, :name, :field_type, :page_id,
                  :page_has_fields_attributes => [:id, :content, :page_id]
                ]

  form do |f|
    f.inputs

    f.has_many :page_fields, heading: false, new_record: false do |g|
      g.inputs :name, :required

      g.has_many :page_has_fields, new_record: false do |h|
        h.input :content if h.object.page_id == f.object.id
      end
    end

    f.actions
  end

end

但是第二个似乎对我来说真的是错误的,我相信这个问题有更好的解决方案。 如果我不使用“if”,则为正确的字段创建输入,但是为每个页面创建输入。

有没有办法在has_many中指定ID或参数?还是一个更好的标签来处理这样的情况?

谢谢

1 个答案:

答案 0 :(得分:0)

尝试将您的设置更改为更像这样的内容

ActiveAdmin.register Page do
  ...
  form do |f|
    f.inputs do
      f.input :some_column
      f.input :some_other_column
      f.input :page_fields, as: :check_boxes, checked: PageField.all.map(&:name)
      f.input :page_has_fields, as: :check_boxes, checked: PageField.all.map(&:content)
    end
    f.actions
  end
end