5

我正在使用 Active Admin,并且两个模型之间存在一对多的关系:

class WeeklyMenu < ActiveRecord::Base
  has_many :menu_items
  attr_accessible :menu_items
  accepts_nested_attributes_for :menu_items
end

在 WeeklyMenu 的管理页面中,我想显示五个 menu_items。这是我的管理页面目前的样子:

ActiveAdmin.register WeeklyMenu do
  form do |f|
    f.inputs "Details" do
      f.input :title
      f.input :week
    end

    f.has_many :menu_items do |menu_item|
      menu_item.input :title
    end

    f.buttons
  end
end

这为我提供了一个非常好的界面来添加更多菜单项,但我希望用户拥有其中的五个——不多也不少。我该怎么做呢?

4

4 回答 4

6

代替

f.has_many :menu_items do |menu_item|
  menu_item.input :title
end

f.inputs "Menu items" do
  5.times do
    f.object.menu_items.build
  end
  f.fields_for :menu_items do |m|
    m.inputs do
      m.input :title
    end
  end
end

可能不是最好的解决方案,但这应该工作......

于 2013-05-05T17:49:13.813 回答
3

@user946611 建议的fields_for答案对我不起作用,但以下代码可以:

f.inputs 'Menu Items' do
  (5 - f.object.menu_items.count).times do
    f.object.menu_items.build
  end

  f.has_many :menu_items, new_record: false do |m|
    m.input :title
    m.input(:_destroy, as: :boolean, required: false, label: 'Remove') if m.object.persisted?
  end
end

这将始终显示项目的 5 个表单,无论它们是否创建了那么多。禁用“new_record: false添加新菜单项”按钮。

于 2013-12-09T22:08:46.643 回答
2

如果您想再次编辑表单,@user946611 的答案缺少判断 menu_item 是否存在的条件,因为在提交和编辑表单时会生成另外五个 menu_item。

所以应该是:

f.inputs 'Menu Items' do
    if !f.object.menu_items.present?
      5.times do
      f.object.menu_items.build
      end
    end
    f.fields_for :menu_items do |m|
      m.inputs do
        m.input :title
      end
    end
  end
于 2015-02-26T08:28:46.880 回答
0

Activeadmin 定义了可用于此类事情的回调: https ://github.com/activeadmin/activeadmin/blob/master/lib/active_admin/resource_dsl.rb#L157-L161

after_build 钩子似乎是初始化 has_many 关系的合适位置

ActiveAdmin.register WeeklyMenu do
  after_build do |weekly_menu|
    (5 - weekly_menu.menu_items.size).times do
      weekly_menu.menu_items.build
    end
  end

  form do |f|
    f.inputs "Details" do
      f.input :title
      f.input :week
    end

    f.has_many :menu_items do |menu_item|
      menu_item.input :title
    end

    f.buttons
  end
end
于 2016-11-18T16:11:11.280 回答