class Audited::Audit
Public Class Methods
as_user(user) { || ... }
click to toggle source
All audits made during the block called will be recorded as made by user. This method is hopefully threadsafe, making it ideal for background operations that require audit information.
# File lib/audited/audit.rb, line 136 def self.as_user(user) last_audited_user = ::Audited.store[:audited_user] ::Audited.store[:audited_user] = user yield ensure ::Audited.store[:audited_user] = last_audited_user end
assign_revision_attributes(record, attributes)
click to toggle source
@private
# File lib/audited/audit.rb, line 153 def self.assign_revision_attributes(record, attributes) attributes.each do |attr, val| record = record.dup if record.frozen? if record.respond_to?("#{attr}=") record.attributes.key?(attr.to_s) ? record[attr] = val : record.send("#{attr}=", val) end end record end
audited_classes()
click to toggle source
Returns the list of classes that are being audited
# File lib/audited/audit.rb, line 129 def self.audited_classes audited_class_names.map(&:constantize) end
collection_cache_key(collection = all, *)
click to toggle source
use created_at as timestamp cache key
Calls superclass method
# File lib/audited/audit.rb, line 167 def self.collection_cache_key(collection = all, *) super(collection, :created_at) end
reconstruct_attributes(audits)
click to toggle source
@private
# File lib/audited/audit.rb, line 145 def self.reconstruct_attributes(audits) audits.each_with_object({}) do |audit, all| all.merge!(audit.new_attributes) all[:audit_version] = audit.version end end
Public Instance Methods
ancestors()
click to toggle source
Return all audits older than the current one.
# File lib/audited/audit.rb, line 65 def ancestors self.class.ascending.auditable_finder(auditable_id, auditable_type).to_version(version) end
new_attributes()
click to toggle source
Returns a hash of the changed attributes with the new values
# File lib/audited/audit.rb, line 79 def new_attributes (audited_changes || {}).each_with_object({}.with_indifferent_access) do |(attr, values), attrs| attrs[attr] = (action == "update") ? values.last : values end end
old_attributes()
click to toggle source
Returns a hash of the changed attributes with the old values
# File lib/audited/audit.rb, line 86 def old_attributes (audited_changes || {}).each_with_object({}.with_indifferent_access) do |(attr, values), attrs| attrs[attr] = (action == "update") ? values.first : values end end
revision()
click to toggle source
Return an instance of what the object looked like at this revision. If the object has been destroyed, this will be a new record.
# File lib/audited/audit.rb, line 71 def revision clazz = auditable_type.constantize (clazz.find_by_id(auditable_id) || clazz.new).tap do |m| self.class.assign_revision_attributes(m, self.class.reconstruct_attributes(ancestors).merge(audit_version: version)) end end
undo()
click to toggle source
Allows user to undo changes
# File lib/audited/audit.rb, line 93 def undo case action when "create" # destroys a newly created record auditable.destroy! when "destroy" # creates a new record with the destroyed record attributes auditable_type.constantize.create!(audited_changes) when "update" # changes back attributes auditable.update!(audited_changes.transform_values(&:first)) else raise StandardError, "invalid action given #{action}" end end
user_as_string()
click to toggle source
@private
# File lib/audited/audit.rb, line 122 def user_as_string user_as_model || username end
Also aliased as: user
user_as_string=(user)
click to toggle source
Allows user to be set to either a string or an ActiveRecord object @private
# File lib/audited/audit.rb, line 111 def user_as_string=(user) # reset both either way self.user_as_model = self.username = nil user.is_a?(::ActiveRecord::Base) ? self.user_as_model = user : self.username = user end
Also aliased as: user=
Private Instance Methods
set_audit_user()
click to toggle source
# File lib/audited/audit.rb, line 183 def set_audit_user self.user ||= ::Audited.store[:audited_user] # from .as_user self.user ||= ::Audited.store[:current_user].try!(:call) # from Sweeper nil # prevent stopping callback chains end
set_remote_address()
click to toggle source
# File lib/audited/audit.rb, line 194 def set_remote_address self.remote_address ||= ::Audited.store[:current_remote_address] end
set_request_uuid()
click to toggle source
# File lib/audited/audit.rb, line 189 def set_request_uuid self.request_uuid ||= ::Audited.store[:current_request_uuid] self.request_uuid ||= SecureRandom.uuid end
set_version_number()
click to toggle source
# File lib/audited/audit.rb, line 173 def set_version_number if action == "create" self.version = 1 else collection = (ActiveRecord::VERSION::MAJOR >= 6) ? self.class.unscoped : self.class max = collection.auditable_finder(auditable_id, auditable_type).maximum(:version) || 0 self.version = max + 1 end end