aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
authorRyan Wallace <rywall@gmail.com>2018-02-06 14:53:26 -0500
committerRyan Wallace <rywall@gmail.com>2018-02-06 16:05:39 -0500
commit56640b4de4e3245b087ca16e0f3bec751c6d6fb7 (patch)
treeaeeca67774cfc9068de83ee8f1b3265f7629995c /activesupport
parentd57c52a385eb57c6ce8c6d124ab5e186f931d142 (diff)
downloadrails-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.
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/lib/active_support/callbacks.rb36
-rw-r--r--activesupport/test/callback_inheritance_test.rb10
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