From 6ee313de5ebe1c67ef93bdac69fee3dc34f5adf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Tue, 2 Mar 2010 03:40:15 -0200 Subject: [PATCH] make UserActionObserver work (Rails bug #4087) Monkeypatch ActiveRecord::Observer to always return true after `notify_observers` in "_notify_observers_for_#{method}" callbacks, making it again possible to observe before_* events without these methods halting the callbacks chain all the time. --- app/models/user_action_observer.rb | 4 ++-- .../initializers/active_record_extensions.rb | 22 ++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/app/models/user_action_observer.rb b/app/models/user_action_observer.rb index 825580da3..a47e40c3a 100644 --- a/app/models/user_action_observer.rb +++ b/app/models/user_action_observer.rb @@ -4,10 +4,10 @@ class UserActionObserver < ActiveRecord::Observer cattr_accessor :current_user def before_create(model) - model.created_by = @@current_user + model.created_by = current_user end def before_update(model) - model.updated_by = @@current_user + model.updated_by = current_user end end \ No newline at end of file diff --git a/config/initializers/active_record_extensions.rb b/config/initializers/active_record_extensions.rb index 9fd92280f..4d285a481 100644 --- a/config/initializers/active_record_extensions.rb +++ b/config/initializers/active_record_extensions.rb @@ -1,6 +1,6 @@ require 'active_record' -class ActiveRecord::Base +ActiveRecord::Base.class_eval do def self.object_id_attr(symbol, klass) module_eval %{ def #{symbol} @@ -16,3 +16,23 @@ def #{symbol} } end end + +ActiveRecord::Observer.class_eval do + protected + alias_method :original_add_observer!, :add_observer! + + # monkeypatch to fix observers for before_* callbacks + def add_observer!(klass) + super + + # Check if a notifier callback was already added to the given class. If + # it was not, add it. + self.class.observed_methods.each do |method| + callback = :"_notify_observers_for_#{method}" + if (klass.instance_methods & [callback, callback.to_s]).empty? + klass.class_eval "def #{callback}; notify_observers(:#{method}); true; end" + klass.send(method, callback) + end + end + end +end