diff --git a/actionpack/lib/action_controller/filters.rb b/actionpack/lib/action_controller/filters.rb
index 83275bb5a6..113dba05d2 100644
--- a/actionpack/lib/action_controller/filters.rb
+++ b/actionpack/lib/action_controller/filters.rb
@@ -248,10 +248,7 @@ module ActionController #:nodoc:
# The passed filters will be appended to the filter_chain and
# will execute before the action on this controller is performed.
def append_before_filter(*filters, &block)
- new_filters, existing_filters = look_for_existing_filters(filters, :before)
-
- append_filter_to_chain(new_filters, :before, &block)
- skip_before_filter(existing_filters) unless existing_filters.empty?
+ append_filter_to_chain(filters, :before, &block)
end
# The passed filters will be prepended to the filter_chain and
@@ -266,10 +263,7 @@ module ActionController #:nodoc:
# The passed filters will be appended to the array of filters
# that run _after_ actions on this controller are performed.
def append_after_filter(*filters, &block)
- new_filters, existing_filters = look_for_existing_filters(filters, :after)
-
- prepend_filter_to_chain(new_filters, :after, &block)
- skip_after_filter(existing_filters) unless existing_filters.empty?
+ prepend_filter_to_chain(filters, :after, &block)
end
# The passed filters will be prepended to the array of filters
@@ -411,6 +405,10 @@ module ActionController #:nodoc:
false
end
+ def around?
+ true
+ end
+
def call(controller, &block)
raise(ActionControllerError, 'No filter type: Nothing to do here.')
end
@@ -422,6 +420,10 @@ module ActionController #:nodoc:
def filter
@filter.filter
end
+
+ def around?
+ false
+ end
end
class BeforeFilterProxy < FilterProxy #:nodoc:
@@ -494,27 +496,26 @@ module ActionController #:nodoc:
def create_filters(filters, position, &block) #:nodoc:
filters, conditions = extract_conditions(filters, &block)
+ filters.map! { |filter| find_or_create_filter(filter,position) }
+ update_conditions(filters, conditions)
+ filters
+ end
- filters.map! do |filter|
- # change all the filters into instances of Filter derived classes
- class_for_filter(filter).new(filter)
- end
-
- filters.map! do |filter|
+ def find_or_create_filter(filter,position)
+ if found_filter = find_filter(filter) { |f| f.send("#{position}?") }
+ found_filter
+ else
+ f = class_for_filter(filter).new(filter)
# apply proxy to filter if necessary
case position
when :before
- BeforeFilterProxy.new(filter)
+ BeforeFilterProxy.new(f)
when :after
- AfterFilterProxy.new(filter)
+ AfterFilterProxy.new(f)
else
- filter
+ f
end
end
-
- update_conditions(filters, conditions)
-
- filters
end
# The determination of the filter type was once done at run time.
@@ -603,27 +604,6 @@ module ActionController #:nodoc:
end
end
end
-
- def look_for_existing_filters(filters, which)
- filters, options = extract_conditions(filters)
- old_filters = []
-
- filter_chain.select(&"#{which}?".to_sym).each do |f|
- old_filters << f.filter if filters.include?(f.filter)
- end
-
- new_filters = filters - old_filters + [options]
-
- if options[:except]
- old_filters << { :only => options[:except] }
- elsif options[:only]
- old_filters << { :except => options[:only] }
- else
- old_filters = []
- end
-
- [new_filters, old_filters]
- end
end
module InstanceMethods # :nodoc: