table_for中关联资源的主动管理员默认操作



我有一个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

相关内容

  • 没有找到相关文章

最新更新