Ruby on Rails - 使用ActiveAdmin和Papertrail - 一种DRY的方法

3

我有很多模型都使用了PaperTrail,例如:

class User < ActiveRecord::Base
  has_paper_trail
end

在ActiveAdmin模型文件中,我有以下内容:

ActiveAdmin.register User do

  ...

  # versioning part
  action_item :history, only: :show do
    link_to('History', history_backend_user_path(user), method: :get)
  end

  sidebar :versionate, :partial => "layouts/version", :only => :show

  member_action :history do
    @user = User.find(params[:id])
    @versions = @user.versions.reorder(created_at: :desc)
    render "layouts/history"
  end
end

我必须为每个模型重复这些行,我在想如何可以简化它。


顺便问一下,您看过审计插件了吗? - Piers C
2个回答

2

最终我得出了以下解决方案,它已经可以工作了(同时注意所有对User资源的引用已被泛化):

# app/admin-shared/active_admin_loggable.rb

module ActiveAdminLoggable
  def self.extended(base)
    base.instance_eval do
      action_item :history, only: :show do
        link_to('History',
                eval("history_backend_#{resource.class.to_s.downcase}_path(#{resource.class.to_s.downcase})"),
                method: :get
        )
      end

      sidebar :versionate, :partial => "layouts/version", :only => :show

      member_action :history do
        @this_resource = eval("resource.class").find(params[:id])
        @versions = @this_resource.versions.reorder(created_at: :desc)
        render "layouts/history"
      end
    end
  end
end

并且:

# app/admin/user.rb
ActiveAdmin.register User do
  extend ActiveAdminLoggable
  ...
end

0

尝试将通用代码分离成一个关注点。然后,您可以使用ActiveAdmin的include方法将通用代码合并到资源中。

这是应该包含您通用代码的模块:

# app/admin/concerns/versionable.rb
module Versionable
  def self.included(dsl)
    dsl.action_item :history, only: :show do
      link_to 'History', dsl.history_backend_user_path(user), method: :get
    end

    dsl.sidebar :versionate, :partial => "layouts/version", :only => :show

    dsl.member_action :history do
      @user = User.find(params[:id])
      @versions = @user.versions.reorder(created_at: :desc)
      render "layouts/history"
    end
  end
end

您可以将此模块包含在您的ActiveAdmin资源中。示例:
# app/admin/user.rb
ActiveAdmin.register User do
  include Versionable
  ...
end

这是基于这篇Stack Overflow帖子的。它尚未经过测试。


谢谢你的回答,我最终使用了我在答案中展示的代码,我亲自测试过,它可以正常工作 :) - davideghz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接