diff options
author | Ryan Wallace <rywall@gmail.com> | 2018-02-06 14:53:26 -0500 |
---|---|---|
committer | Ryan Wallace <rywall@gmail.com> | 2018-02-06 16:05:39 -0500 |
commit | 56640b4de4e3245b087ca16e0f3bec751c6d6fb7 (patch) | |
tree | aeeca67774cfc9068de83ee8f1b3265f7629995c | |
parent | d57c52a385eb57c6ce8c6d124ab5e186f931d142 (diff) | |
download | rails-56640b4de4e3245b087ca16e0f3bec751c6d6fb7.tar.gz rails-56640b4de4e3245b087ca16e0f3bec751c6d6fb7.tar.bz2 rails-56640b4de4e3245b087ca16e0f3bec751c6d6fb7.zip |
Define callbacks on descendants.
We set callbacks on all descendants, so we need to make sure that they are also defined on all descendants as well.
-rw-r--r-- | activesupport/lib/active_support/callbacks.rb | 36 | ||||
-rw-r--r-- | activesupport/test/callback_inheritance_test.rb | 10 |
2 files changed, 29 insertions, 17 deletions
diff --git a/activesupport/lib/active_support/callbacks.rb b/activesupport/lib/active_support/callbacks.rb index 0ed4681b7d..cece3eb19f 100644 --- a/activesupport/lib/active_support/callbacks.rb +++ b/activesupport/lib/active_support/callbacks.rb @@ -806,28 +806,30 @@ module ActiveSupport def define_callbacks(*names) options = names.extract_options! - names.each do |name| - name = name.to_sym + ([self] + ActiveSupport::DescendantsTracker.descendants(self)).each do |target| + names.each do |name| + name = name.to_sym - set_callbacks name, CallbackChain.new(name, options) + target.set_callbacks name, CallbackChain.new(name, options) - module_eval <<-RUBY, __FILE__, __LINE__ + 1 - def _run_#{name}_callbacks(&block) - run_callbacks #{name.inspect}, &block - end + target.module_eval <<-RUBY, __FILE__, __LINE__ + 1 + def _run_#{name}_callbacks(&block) + run_callbacks #{name.inspect}, &block + end - def self._#{name}_callbacks - get_callbacks(#{name.inspect}) - end + def self._#{name}_callbacks + get_callbacks(#{name.inspect}) + end - def self._#{name}_callbacks=(value) - set_callbacks(#{name.inspect}, value) - end + def self._#{name}_callbacks=(value) + set_callbacks(#{name.inspect}, value) + end - def _#{name}_callbacks - __callbacks[#{name.inspect}] - end - RUBY + def _#{name}_callbacks + __callbacks[#{name.inspect}] + end + RUBY + end end end diff --git a/activesupport/test/callback_inheritance_test.rb b/activesupport/test/callback_inheritance_test.rb index 015e17deb9..5633b6e2b8 100644 --- a/activesupport/test/callback_inheritance_test.rb +++ b/activesupport/test/callback_inheritance_test.rb @@ -176,3 +176,13 @@ class DynamicInheritedCallbacks < ActiveSupport::TestCase assert_equal 1, child.count end end + +class DynamicDefinedCallbacks < ActiveSupport::TestCase + def test_callbacks_should_be_performed_once_in_child_class_after_dynamic_define + GrandParent.define_callbacks(:foo) + GrandParent.set_callback(:foo, :before, :before1) + parent = Parent.new("foo") + parent.run_callbacks(:foo) + assert_equal %w(before1), parent.log + end +end |