mirror of
https://github.com/github/rails.git
synced 2026-02-02 02:04:59 -05:00
Run callbacks from object's metaclass [#575 state:resolved]
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
*Edge*
|
||||
|
||||
* Run callbacks from object's metaclass [Josh Peek]
|
||||
|
||||
* Add Array#in_groups which splits or iterates over the array in specified number of groups. #579. [Adrian Mugnolo] Example:
|
||||
|
||||
a = (1..10).to_a
|
||||
|
||||
@@ -269,7 +269,15 @@ module ActiveSupport
|
||||
# pass
|
||||
# stop
|
||||
def run_callbacks(kind, options = {}, &block)
|
||||
self.class.send("#{kind}_callback_chain").run(self, options, &block)
|
||||
callback_chain_method = "#{kind}_callback_chain"
|
||||
|
||||
# Meta class inherits Class so we don't have to merge it in 1.9
|
||||
if RUBY_VERSION >= '1.9'
|
||||
metaclass.send(callback_chain_method).run(self, options, &block)
|
||||
else
|
||||
callbacks = self.class.send(callback_chain_method) | metaclass.send(callback_chain_method)
|
||||
callbacks.run(self, options, &block)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -84,6 +84,30 @@ class CallbacksTest < Test::Unit::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
class MetaclassCallbacksTest < Test::Unit::TestCase
|
||||
module ModuleWithCallbacks
|
||||
def self.extended(object)
|
||||
object.metaclass.before_save :raise_metaclass_callback_called
|
||||
end
|
||||
|
||||
def module_callback_called?
|
||||
@module_callback_called ||= false
|
||||
end
|
||||
|
||||
def raise_metaclass_callback_called
|
||||
@module_callback_called = true
|
||||
end
|
||||
end
|
||||
|
||||
def test_metaclass_callbacks
|
||||
person = Person.new
|
||||
person.extend(ModuleWithCallbacks)
|
||||
assert !person.module_callback_called?
|
||||
person.save
|
||||
assert person.module_callback_called?
|
||||
end
|
||||
end
|
||||
|
||||
class ConditionalCallbackTest < Test::Unit::TestCase
|
||||
def test_save_conditional_person
|
||||
person = ConditionalPerson.new
|
||||
|
||||
Reference in New Issue
Block a user