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 |