table_for中关联资源的ActiveAdmin默认操作

问题描述 投票:1回答:1

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

ruby-on-rails activeadmin has-many
1个回答
1
投票

徘徊了一段时间后,我找到了解决方案,不确定这是否是最好的方法,但我想我会分享:

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

© www.soinside.com 2019 - 2024. All rights reserved.