覆盖ActiveAdmin中的操作

时间:2019-02-06 21:58:45

标签: ruby-on-rails activeadmin

ActiveAdmin允许使用 actions 方法,该方法将视图添加,编辑和删除到索引视图。

我在每个索引视图上都用这样的东西覆盖它:

  actions defaults: false do |word|
      item "View", admin_word_path(word), class: 'edit_link member_link'
  end

这很好用,但是我只想对所有索引视图进行全局覆盖,这不需要我为每个索引视图编写此代码。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

一种方法是在IndexTableFor中动态打开module ActiveAdmin类。冒险,因为这最终可能会因ActiveAdmin升级而中断。将以下代码段粘贴到config/initializers/active_admin.rb文件的末尾。我用activeadmin 1.1,rails 5.1和ruby 2.4.2进行了测试,并且可以正常工作。

module ActiveAdmin
  module Views
    class IndexAsTable < ActiveAdmin::Component
      class IndexTableFor < ::ActiveAdmin::Views::TableFor
        def defaults(resource, options = {})
          if controller.action_methods.include?('show') && authorized?(ActiveAdmin::Auth::READ, resource)
            item I18n.t('active_admin.view'), resource_path(resource), class: "view_link #{options[:css_class]}", title: I18n.t('active_admin.view')
          end
          if controller.action_methods.include?('edit') && authorized?(ActiveAdmin::Auth::UPDATE, resource)
            item I18n.t('active_admin.edit'), edit_resource_path(resource), class: "edit_link #{options[:css_class]}", title: I18n.t('active_admin.edit')
          end
          if controller.action_methods.include?('destroy') && authorized?(ActiveAdmin::Auth::DESTROY, resource)
            item I18n.t('active_admin.delete'), resource_path(resource), class: "delete_link #{options[:css_class]}", title: I18n.t('active_admin.delete'),
              method: :delete, data: {confirm:    I18n.t('active_admin.delete_confirmation')}
          end
        end
      end
    end

您现在可以按照自己的方式进行调整。请记住重新启动Rails服务器,因为它是initializer

祝你好运!