Merge pull request #6063 from marcandre/observer_extra_args
Allow extra arguments for Observers
This commit is contained in:
commit
206b43a954
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue