mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Simplified and renamed CallbackChain union method to replace_or_append!
This commit is contained in:
parent
f388725bd6
commit
6be8251ec8
3 changed files with 18 additions and 13 deletions
|
@ -44,7 +44,7 @@ module ActionController
|
|||
def to_prepare(identifier = nil, &block)
|
||||
@prepare_dispatch_callbacks ||= ActiveSupport::Callbacks::CallbackChain.new
|
||||
callback = ActiveSupport::Callbacks::Callback.new(:prepare_dispatch, block, :identifier => identifier)
|
||||
@prepare_dispatch_callbacks | callback
|
||||
@prepare_dispatch_callbacks.replace_or_append!(callback)
|
||||
end
|
||||
|
||||
# If the block raises, send status code as a last-ditch response.
|
||||
|
|
|
@ -96,15 +96,12 @@ module ActiveSupport
|
|||
end
|
||||
end
|
||||
|
||||
def |(chain)
|
||||
if chain.is_a?(CallbackChain)
|
||||
chain.each { |callback| self | callback }
|
||||
# TODO: Decompose into more Array like behavior
|
||||
def replace_or_append!(chain)
|
||||
if index = index(chain)
|
||||
self[index] = chain
|
||||
else
|
||||
if (found_callback = find(chain)) && (index = index(chain))
|
||||
self[index] = chain
|
||||
else
|
||||
self << chain
|
||||
end
|
||||
self << chain
|
||||
end
|
||||
self
|
||||
end
|
||||
|
@ -157,6 +154,14 @@ module ActiveSupport
|
|||
self.class.new(@kind, @method, @options.dup)
|
||||
end
|
||||
|
||||
def hash
|
||||
if @identifier
|
||||
@identifier.hash
|
||||
else
|
||||
@method.hash
|
||||
end
|
||||
end
|
||||
|
||||
def call(*args, &block)
|
||||
evaluate_method(method, *args, &block) if should_run_callback?(*args)
|
||||
rescue LocalJumpError
|
||||
|
|
|
@ -134,10 +134,10 @@ class CallbackChainTest < Test::Unit::TestCase
|
|||
assert_equal :bacon, @chain.find(:bacon).method
|
||||
end
|
||||
|
||||
def test_union
|
||||
assert_equal [:bacon, :lettuce, :tomato], (@chain | Callback.new(:make, :bacon)).map(&:method)
|
||||
assert_equal [:bacon, :lettuce, :tomato, :turkey], (@chain | CallbackChain.build(:make, :bacon, :lettuce, :tomato, :turkey)).map(&:method)
|
||||
assert_equal [:bacon, :lettuce, :tomato, :turkey, :mayo], (@chain | Callback.new(:make, :mayo)).map(&:method)
|
||||
def test_replace_or_append
|
||||
assert_equal [:bacon, :lettuce, :tomato], (@chain.replace_or_append!(Callback.new(:make, :bacon))).map(&:method)
|
||||
assert_equal [:bacon, :lettuce, :tomato, :turkey], (@chain.replace_or_append!(Callback.new(:make, :turkey))).map(&:method)
|
||||
assert_equal [:bacon, :lettuce, :tomato, :turkey, :mayo], (@chain.replace_or_append!(Callback.new(:make, :mayo))).map(&:method)
|
||||
end
|
||||
|
||||
def test_delete
|
||||
|
|
Loading…
Reference in a new issue