Merge pull request #6063 from marcandre/observer_extra_args

Allow extra arguments for Observers
This commit is contained in:
Aaron Patterson 2012-04-30 16:43:22 -07:00
commit 206b43a954
2 changed files with 26 additions and 11 deletions

View File

@ -113,13 +113,21 @@ module ActiveModel
private
# Fires notifications to model's observers
#
# def save
# notify_observers(:before_save)
# ...
# notify_observers(:after_save)
# end
def notify_observers(method)
self.class.notify_observers(method, self)
# def save
# notify_observers(:before_save)
# ...
# notify_observers(:after_save)
# end
#
# Custom notifications can be sent in a similar fashion:
#
# notify_observers(:custom_notification, :foo)
#
# This will call +custom_notification+, passing as arguments
# the current object and :foo.
#
def notify_observers(method, *extra_args)
self.class.notify_observers(method, self, *extra_args)
end
end
@ -230,10 +238,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, &block) #:nodoc:
def update(observed_method, object, *extra_args, &block) #:nodoc:
return unless respond_to?(observed_method)
return if disabled_for?(object)
send(observed_method, object, &block)
send(observed_method, object, *extra_args, &block)
end
# Special method sent by the observed class when it is inherited.

View File

@ -14,8 +14,8 @@ class FooObserver < ActiveModel::Observer
attr_accessor :stub
def on_spec(record)
stub.event_with(record) if stub
def on_spec(record, *args)
stub.event_with(record, *args) if stub
end
def around_save(record)
@ -141,6 +141,13 @@ class ObserverTest < ActiveModel::TestCase
Foo.send(:notify_observers, :on_spec, foo)
end
test "passes extra arguments" do
foo = Foo.new
FooObserver.instance.stub = stub
FooObserver.instance.stub.expects(:event_with).with(foo, :bar)
Foo.send(:notify_observers, :on_spec, foo, :bar)
end
test "skips nonexistent observer event" do
foo = Foo.new
Foo.send(:notify_observers, :whatever, foo)