aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/callbacks.rb
diff options
context:
space:
mode:
authorclaudiob <claudiob@gmail.com>2014-12-14 22:46:23 -0800
committerclaudiob <claudiob@gmail.com>2015-01-02 15:31:55 -0800
commitd217daf6a740de7e4925872abe632982cfaab89b (patch)
treeab0fe69ba6f3bc4d07aaaa3530633ebd8ca14d63 /activesupport/lib/active_support/callbacks.rb
parent2386daabe7f8c979b453010dc0de3e1f6bbf859d (diff)
downloadrails-d217daf6a740de7e4925872abe632982cfaab89b.tar.gz
rails-d217daf6a740de7e4925872abe632982cfaab89b.tar.bz2
rails-d217daf6a740de7e4925872abe632982cfaab89b.zip
Deprecate `false` as the way to halt AS callbacks
After this commit, returning `false` in a callback will display a deprecation warning to make developers aware of the fact that they need to explicitly `throw(:abort)` if their intention is to halt a callback chain. This commit also patches two internal uses of AS::Callbacks (inside ActiveRecord and ActionDispatch) which sometimes return `false` but whose returned value is not meaningful for the purpose of execution. In both cases, the returned value is set to `true`, which does not affect the execution of the callbacks but prevents unrequested deprecation warnings from showing up.
Diffstat (limited to 'activesupport/lib/active_support/callbacks.rb')
-rw-r--r--activesupport/lib/active_support/callbacks.rb16
1 files changed, 14 insertions, 2 deletions
diff --git a/activesupport/lib/active_support/callbacks.rb b/activesupport/lib/active_support/callbacks.rb
index 3a3061e536..7dd97eb1ab 100644
--- a/activesupport/lib/active_support/callbacks.rb
+++ b/activesupport/lib/active_support/callbacks.rb
@@ -4,6 +4,7 @@ require 'active_support/core_ext/array/extract_options'
require 'active_support/core_ext/class/attribute'
require 'active_support/core_ext/kernel/reporting'
require 'active_support/core_ext/kernel/singleton_class'
+require 'active_support/core_ext/string/filters'
require 'thread'
module ActiveSupport
@@ -595,12 +596,23 @@ module ActiveSupport
Proc.new do |target, result_lambda|
terminate = true
catch(:abort) do
- result_lambda.call if result_lambda.is_a?(Proc)
- terminate = false
+ result = result_lambda.call if result_lambda.is_a?(Proc)
+ if result == false
+ display_deprecation_warning_for_false_terminator
+ else
+ terminate = false
+ end
end
terminate
end
end
+
+ def display_deprecation_warning_for_false_terminator
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
+ Returning `false` in a callback will not implicitly halt a callback chain in the next release of Rails.
+ To explicitly halt a callback chain, please use `throw :abort` instead.
+ MSG
+ end
end
module ClassMethods