Sha256: 5537ddf74b9a7b70f0cc321afc9e829932cb4bfffa8d30ae674d6df68b117fab

Contents?: true

Size: 1.91 KB

Versions: 1

Compression:

Stored size: 1.91 KB

Contents

module TrackChanges
  # An around filter that will audit changes to your models.
  #
  # Example:
  #   class OrdersController < ApplicationController
  #     before_filter :find_order, :except => [:index, :new, :create]
  #     around_filter AuditFilter.new(:order), :only => :update
  #
  #     def update
  #       ...
  #     end
  #
  #     protected
  #
  #     def find_order
  #       @order = Order.find(params[:id])
  #     end
  #   end
  class AuditFilter
    attr_accessor :cached_models, :models

    def initialize(*models)
      models.flatten!
      options = models.extract_options!

      self.cached_models = {}
      self.models = models

      @audit_accessor = options[:audit_accessor] || :audits
      @current_user   = options[:current_user] || :current_user
      @ignore_nils = if options[:ignore_nil] == false
        false
      else
        true
      end
    end

    def before(controller)
      self.models.each do |model|
        instance_variable_symbol = "@#{model}".to_sym
        instance = controller.instance_variable_get(instance_variable_symbol)
        next if instance.nil? && @ignore_nils

        self.cached_models[instance_variable_symbol] = instance.clone
      end
    end

    def after(controller)
      self.cached_models.each_pair do |instance_variable_symbol, original_instance|
        new_instance = controller.instance_variable_get(instance_variable_symbol)
        next if new_instance.changed? # Dirty objects didn't save

        changes = changes_between(new_instance, original_instance)

        unless changes.empty?
          audit = new_instance.send(@audit_accessor).create!(:user => controller.send(@current_user), :change_set => changes)
        end
      end
    end

    private

    def changes_between(new, old)
      clone = old.clone
      clone.attributes = new.attributes
      clone.changes
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
track_changes-0.5.1 lib/track_changes/audit_filter.rb