我有一个Album
模型,与另一个Track
模型具有has_many
关系。两种型号在 ActiveAdmin 中都有自己的专用页面和菜单条目,我想保持这一点,因为查看所有曲目而不是特定专辑的所有曲目可能很有用。
我想在专辑的显示页面中添加相关曲目的列表。我偶然发现了table_for
它的效果非常好,但没有actions
方法来显示"查看"、"编辑"和"删除"按钮。我想我可以重新创建它们,但在此之前,我想检查是否有办法模仿用于索引页的actions
方法?
所以我在app/admin/albums.rb
有以下方法,灵感来自 https://stackoverflow.com/a/13429204/1439489:
show do
attributes_table do
row :name
row :release_date
row :tags
end
panel 'Tracks' do
index_table_for(album.tracks.order(position: :asc, id: :desc), class: 'index_table') do
column :id
column(:name) { |track| auto_link track }
column :position
column :duration
# <- add actions here
end
end
end
PS :我知道我可以使用部分,但是要显示专辑的所有曲目与所有曲目的属性列表并不相同; 我也不确定显示操作是否有帮助,因为上面提到的答案使用default_actions rescue nil
很可能是出于这个确切的原因
经过一番徘徊,我找到了一个解决方案,不确定这是否是最好的方法,但我想我会分享:
lib/active_admin_exts.rb
class ActiveAdmin::Views::IndexAsTable::IndexTableFor
builder_method :index_table_for
end
config/initializers/active_admin.rb
require 'active_admin_exts'
app/admin/albums.rb
ActiveAdmin.register Album do
permit_params ...
index do
...
end
show do
attributes_table do
row :name
row :release_date
row :tags
end
panel I18n.t('admin.labels.tracks') do
# use *index_table_for* instead of *table_for*
index_table_for(album.tracks.order(position: :asc, id: :desc), class: 'index_table') do
id_column # now available
column :name
column :position
column :duration
actions # now available
end
end
end
form do |f|
...
end
end
我希望这可以帮助那些试图快速实现同样事情的人。如果出于某种原因这是一个投标想法,请随时告诉我并提出更好的方法!
编辑:小心你的行为:
- 如果禁用"专辑"的"
destroy
"操作,则专辑页面中列出的关联曲目也会隐藏"删除"操作 - 如果您禁用"曲目"的
destroy
操作,专辑页面中列出的关联曲目仍将显示"删除"操作
对于我的用例来说,这已经足够好了,因为这是一个小项目,并且在对象级别可以防止破坏,但是我已经向作者提出了一个问题以正确调查:https://github.com/activeadmin/activeadmin/issues/5959