module Audited::Auditor::AuditedInstanceMethods

Public Instance Methods

audited_attributes() click to toggle source

List of attributes that are audited.

# File lib/audited/auditor.rb, line 131
def audited_attributes
  attributes.except(*non_audited_columns)
end
non_audited_columns() click to toggle source
# File lib/audited/auditor.rb, line 135
def non_audited_columns
  self.class.non_audited_columns
end
revision(version) click to toggle source

Get a specific revision specified by the version number, or :previous

# File lib/audited/auditor.rb, line 120
def revision(version)
  revision_with Audited.audit_class.reconstruct_attributes(audits_to(version))
end
revision_at(date_or_time) click to toggle source

Find the oldest revision recorded prior to the date/time provided.

# File lib/audited/auditor.rb, line 125
def revision_at(date_or_time)
  audits = self.audits.up_until(date_or_time)
  revision_with Audited.audit_class.reconstruct_attributes(audits) unless audits.empty?
end
revisions(from_version = 1) click to toggle source

Gets an array of the revisions available

user.revisions.each do |revision|
  user.name
  user.version
end
# File lib/audited/auditor.rb, line 109
def revisions(from_version = 1)
  audits = self.audits.from_version(from_version)
  return [] if audits.empty?
  revisions = []
  audits.each do |audit|
    revisions << audit.revision
  end
  revisions
end
save_without_auditing() click to toggle source

Temporarily turns off auditing while saving.

# File lib/audited/auditor.rb, line 88
def save_without_auditing
  without_auditing { save }
end
without_auditing(&block) click to toggle source

Executes the block with the auditing callbacks disabled.

@foo.without_auditing do
  @foo.save
end
# File lib/audited/auditor.rb, line 98
def without_auditing(&block)
  self.class.without_auditing(&block)
end

Protected Instance Methods

rails_below?(rails_version) click to toggle source
# File lib/audited/auditor.rb, line 171
def rails_below?(rails_version)
  Gem::Version.new(Rails::VERSION::STRING) < Gem::Version.new(rails_version)
end
revision_with(attributes) click to toggle source
# File lib/audited/auditor.rb, line 145
def revision_with(attributes)
  dup.tap do |revision|
    revision.id = id
    revision.send :instance_variable_set, '@attributes', self.attributes if rails_below?('4.2.0')
    revision.send :instance_variable_set, '@new_record', destroyed?
    revision.send :instance_variable_set, '@persisted', !destroyed?
    revision.send :instance_variable_set, '@readonly', false
    revision.send :instance_variable_set, '@destroyed', false
    revision.send :instance_variable_set, '@_destroyed', false
    revision.send :instance_variable_set, '@marked_for_destruction', false
    Audited.audit_class.assign_revision_attributes(revision, attributes)

    # Remove any association proxies so that they will be recreated
    # and reference the correct object for this revision. The only way
    # to determine if an instance variable is a proxy object is to
    # see if it responds to certain methods, as it forwards almost
    # everything to its target.
    revision.instance_variables.each do |ivar|
      proxy = revision.instance_variable_get ivar
      if !proxy.nil? && proxy.respond_to?(:proxy_respond_to?)
        revision.instance_variable_set ivar, nil
      end
    end
  end
end

Private Instance Methods

audit_create() click to toggle source
# File lib/audited/auditor.rb, line 204
def audit_create
  write_audit(action: 'create', audited_changes: audited_attributes,
              comment: audit_comment)
end
audit_destroy() click to toggle source
# File lib/audited/auditor.rb, line 216
def audit_destroy
  write_audit(action: 'destroy', audited_changes: audited_attributes,
              comment: audit_comment) unless new_record?
end
audit_update() click to toggle source
# File lib/audited/auditor.rb, line 209
def audit_update
  unless (changes = audited_changes).empty? && audit_comment.blank?
    write_audit(action: 'update', audited_changes: changes,
                comment: audit_comment)
  end
end
audited_changes() click to toggle source
# File lib/audited/auditor.rb, line 177
def audited_changes
  collection =
    if audited_options[:only]
      audited_columns = self.class.audited_columns.map(&:name)
      changed_attributes.slice(*audited_columns)
    else
      changed_attributes.except(*non_audited_columns)
    end

  collection.inject({}) do |changes, (attr, old_value)|
    changes[attr] = [old_value, self[attr]]
    changes
  end
end
auditing_enabled() click to toggle source
# File lib/audited/auditor.rb, line 242
def auditing_enabled
  self.class.auditing_enabled
end
auditing_enabled=(val) click to toggle source
# File lib/audited/auditor.rb, line 246
def auditing_enabled=(val)
  self.class.auditing_enabled = val
end
audits_to(version = nil) click to toggle source
# File lib/audited/auditor.rb, line 192
def audits_to(version = nil)
  if version == :previous
    version = if self.version
                self.version - 1
              else
                previous = audits.descending.offset(1).first
                previous ? previous.version : 1
              end
  end
  audits.to_version(version)
end
require_comment() click to toggle source
# File lib/audited/auditor.rb, line 227
def require_comment
  if auditing_enabled && audit_comment.blank?
    errors.add(:audit_comment, "Comment required before destruction")
    return false if Rails.version.start_with?('4.')
    throw :abort
  end
end
write_audit(attrs) click to toggle source
# File lib/audited/auditor.rb, line 221
def write_audit(attrs)
  attrs[:associated] = send(audit_associated_with) unless audit_associated_with.nil?
  self.audit_comment = nil
  run_callbacks(:audit)  { audits.create(attrs) } if auditing_enabled
end