我有一个与另一个Album
模型具有has_many
关系的Track
模型。两种模型在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