module ActiveAdmin::History
Public Class Methods
included(dsl)
click to toggle source
# File lib/activeadmin/history.rb, line 9 def self.included(dsl) dsl.controller do before_action :before_admin_action, only: [:create, :update, :destroy] after_action :after_admin_action, only: [:create, :update, :destroy] def before_admin_action @admin_user_id = current_admin_user.id @action = params[:action] @param_attributes = params.dig(controller_name.singularize.to_sym) @object_diff = nil if @action == 'update' @object_diff = diff(resource, resource.class.new(@param_attributes.to_unsafe_hash)) end @admin_action = ::AdminAction.create( admin_user_id: @admin_user_id, action: @action, object_params: ActiveSupport::JSON.encode(@param_attributes), object_diff: ActiveSupport::JSON.encode(@object_diff), ) end def after_admin_action @admin_action.update( object_id: resource.id, object_type: resource.class.to_s, ) end private def diff(resource_a, resource_b) h = {} resource_a.attributes.each_pair do |key, value| if resource_a.respond_to?(key) && resource_b.respond_to?(key) unless %w[id created_at updated_at].include?(key) value_a = resource_a.send(key) value_b = resource_b.send(key) if value_a != value_b h[key] = [value_a, value_b] end end end end h end end end
Public Instance Methods
after_admin_action()
click to toggle source
# File lib/activeadmin/history.rb, line 32 def after_admin_action @admin_action.update( object_id: resource.id, object_type: resource.class.to_s, ) end
before_admin_action()
click to toggle source
# File lib/activeadmin/history.rb, line 14 def before_admin_action @admin_user_id = current_admin_user.id @action = params[:action] @param_attributes = params.dig(controller_name.singularize.to_sym) @object_diff = nil if @action == 'update' @object_diff = diff(resource, resource.class.new(@param_attributes.to_unsafe_hash)) end @admin_action = ::AdminAction.create( admin_user_id: @admin_user_id, action: @action, object_params: ActiveSupport::JSON.encode(@param_attributes), object_diff: ActiveSupport::JSON.encode(@object_diff), ) end
diff(resource_a, resource_b)
click to toggle source
# File lib/activeadmin/history.rb, line 41 def diff(resource_a, resource_b) h = {} resource_a.attributes.each_pair do |key, value| if resource_a.respond_to?(key) && resource_b.respond_to?(key) unless %w[id created_at updated_at].include?(key) value_a = resource_a.send(key) value_b = resource_b.send(key) if value_a != value_b h[key] = [value_a, value_b] end end end end h end