aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
diff options
context:
space:
mode:
authorMyron Marston <myron.marston@gmail.com>2011-08-12 19:58:37 -0700
committerMyron Marston <myron.marston@gmail.com>2011-08-12 20:48:44 -0700
commitd3c15a1d31d77e44b142c96cb55b654f3552a89d (patch)
tree6da096998bbd1c3a0764a10a3c933f943b6e973a /activemodel
parent943a37348a9fdef73670be3d8452d436b7db0e69 (diff)
downloadrails-d3c15a1d31d77e44b142c96cb55b654f3552a89d.tar.gz
rails-d3c15a1d31d77e44b142c96cb55b654f3552a89d.tar.bz2
rails-d3c15a1d31d77e44b142c96cb55b654f3552a89d.zip
Allow ActiveRecord observers to be disabled.
We have to use Observer#update rather than Observer#send since the enabled state is checked in #update before forwarding the method call on.
Diffstat (limited to 'activemodel')
-rw-r--r--activemodel/lib/active_model/observing.rb4
-rw-r--r--activemodel/test/cases/observing_test.rb12
2 files changed, 14 insertions, 2 deletions
diff --git a/activemodel/lib/active_model/observing.rb b/activemodel/lib/active_model/observing.rb
index d48f2e8a1f..7a910d18e7 100644
--- a/activemodel/lib/active_model/observing.rb
+++ b/activemodel/lib/active_model/observing.rb
@@ -226,10 +226,10 @@ module ActiveModel
# Send observed_method(object) if the method exists and
# the observer is enabled for the given object's class.
- def update(observed_method, object) #:nodoc:
+ def update(observed_method, object, &block) #:nodoc:
return unless respond_to?(observed_method)
return if disabled_for?(object)
- send(observed_method, object)
+ send(observed_method, object, &block)
end
# Special method sent by the observed class when it is inherited.
diff --git a/activemodel/test/cases/observing_test.rb b/activemodel/test/cases/observing_test.rb
index 99b1f407ae..f6ec24ae57 100644
--- a/activemodel/test/cases/observing_test.rb
+++ b/activemodel/test/cases/observing_test.rb
@@ -17,6 +17,10 @@ class FooObserver < ActiveModel::Observer
def on_spec(record)
stub.event_with(record) if stub
end
+
+ def around_save(record)
+ yield :in_around_save
+ end
end
class Foo
@@ -133,4 +137,12 @@ class ObserverTest < ActiveModel::TestCase
foo = Foo.new
Foo.send(:notify_observers, :whatever, foo)
end
+
+ test "update passes a block on to the observer" do
+ yielded_value = nil
+ FooObserver.instance.update(:around_save, Foo.new) do |val|
+ yielded_value = val
+ end
+ assert_equal :in_around_save, yielded_value
+ end
end