|
@@ -298,8 +298,8 @@ def initialize(name, filter, kind, options, chain_config) |
|
|
@kind = kind |
|
|
@filter = filter |
|
|
@key = compute_identifier filter |
|
|
@if = Array(options[:if]) |
|
|
@unless = Array(options[:unless]) |
|
|
@if = check_conditionals(Array(options[:if])) |
|
|
@unless = check_conditionals(Array(options[:unless])) |
|
|
end |
|
|
|
|
|
def filter; @key; end |
|
@@ -323,7 +323,7 @@ def matches?(_kind, _filter) |
|
|
|
|
|
def duplicates?(other) |
|
|
case @filter |
|
|
when Symbol, String |
|
|
when Symbol |
|
|
matches?(other.kind, other.filter) |
|
|
else |
|
|
false |
|
@@ -350,9 +350,21 @@ def current_scopes |
|
|
end |
|
|
|
|
|
private |
|
|
def check_conditionals(conditionals) |
|
|
if conditionals.any? { |c| c.is_a?(String) } |
|
|
raise ArgumentError, <<-MSG.squish |
|
|
Passing string to be evaluated in :if and :unless conditional |
|
|
options is not supported. Pass a symbol for an instance method, |
|
|
or a lambda, proc or block, instead. |
|
|
MSG |
|
|
end |
|
|
|
|
|
conditionals |
|
|
end |
|
|
|
|
|
def compute_identifier(filter) |
|
|
case filter |
|
|
when String, ::Proc |
|
|
when ::Proc |
|
|
filter.object_id |
|
|
else |
|
|
filter |
|
@@ -427,7 +439,6 @@ def inverted_lambda |
|
|
# Filters support: |
|
|
# |
|
|
# Symbols:: A method to call. |
|
|
# Strings:: Some content to evaluate. |
|
|
# Procs:: A proc to call with the object. |
|
|
# Objects:: An object with a <tt>before_foo</tt> method on it to call. |
|
|
# |
|
@@ -437,8 +448,6 @@ def self.build(filter, callback) |
|
|
case filter |
|
|
when Symbol |
|
|
new(nil, filter, [], nil) |
|
|
when String |
|
|
new(nil, :instance_exec, [:value], compile_lambda(filter)) |
|
|
when Conditionals::Value |
|
|
new(filter, :call, [:target, :value], nil) |
|
|
when ::Proc |
|
@@ -455,10 +464,6 @@ def self.build(filter, callback) |
|
|
new(filter, method_to_call, [:target], nil) |
|
|
end |
|
|
end |
|
|
|
|
|
def self.compile_lambda(filter) |
|
|
eval("lambda { |value| #{filter} }") |
|
|
end |
|
|
end |
|
|
|
|
|
# Execute before and after filters in a sequence instead of |
|
@@ -651,26 +656,17 @@ def __update_callbacks(name) #:nodoc: |
|
|
# |
|
|
# ===== Options |
|
|
# |
|
|
# * <tt>:if</tt> - A symbol, a string (deprecated) or an array of symbols, |
|
|
# each naming an instance method or a proc; the callback will be called |
|
|
# only when they all return a true value. |
|
|
# * <tt>:unless</tt> - A symbol, a string (deprecated) or an array of symbols, |
|
|
# each naming an instance method or a proc; the callback will be called |
|
|
# only when they all return a false value. |
|
|
# * <tt>:if</tt> - A symbol or an array of symbols, each naming an instance |
|
|
# method or a proc; the callback will be called only when they all return |
|
|
# a true value. |
|
|
# * <tt>:unless</tt> - A symbol or an array of symbols, each naming an |
|
|
# instance method or a proc; the callback will be called only when they |
|
|
# all return a false value. |
|
|
# * <tt>:prepend</tt> - If +true+, the callback will be prepended to the |
|
|
# existing chain rather than appended. |
|
|
def set_callback(name, *filter_list, &block) |
|
|
type, filters, options = normalize_callback_params(filter_list, block) |
|
|
|
|
|
if options[:if].is_a?(String) || options[:unless].is_a?(String) |
|
|
ActiveSupport::Deprecation.warn(<<-MSG.squish) |
|
|
Passing string to be evaluated in :if and :unless conditional |
|
|
options is deprecated and will be removed in Rails 5.2 without |
|
|
replacement. Pass a symbol for an instance method, or a lambda, |
|
|
proc or block, instead. |
|
|
MSG |
|
|
end |
|
|
|
|
|
self_chain = get_callbacks name |
|
|
mapped = filters.map do |filter| |
|
|
Callback.build(self_chain, filter, type, options) |
|
@@ -695,13 +691,6 @@ def set_callback(name, *filter_list, &block) |
|
|
def skip_callback(name, *filter_list, &block) |
|
|
type, filters, options = normalize_callback_params(filter_list, block) |
|
|
|
|
|
if options[:if].is_a?(String) || options[:unless].is_a?(String) |
|
|
ActiveSupport::Deprecation.warn(<<-MSG.squish) |
|
|
Passing string to :if and :unless conditional options is deprecated |
|
|
and will be removed in Rails 5.2 without replacement. |
|
|
MSG |
|
|
end |
|
|
|
|
|
options[:raise] = true unless options.key?(:raise) |
|
|
|
|
|
__update_callbacks(name) do |target, chain| |
|
|