aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller
diff options
context:
space:
mode:
authorJamis Buck <jamis@37signals.com>2006-10-14 01:54:42 +0000
committerJamis Buck <jamis@37signals.com>2006-10-14 01:54:42 +0000
commitef6921628d4906fcd2945f2f90b050ff5b5ec258 (patch)
treeff54525b5aeb3f7598c1b1f6ebe52104d06bb023 /actionpack/lib/action_controller
parent81ddeadd4962f110d51a073a270c844407222593 (diff)
downloadrails-ef6921628d4906fcd2945f2f90b050ff5b5ec258.tar.gz
rails-ef6921628d4906fcd2945f2f90b050ff5b5ec258.tar.bz2
rails-ef6921628d4906fcd2945f2f90b050ff5b5ec258.zip
make sure filters in subclasses with :only or :except conditions are treated like skip_filter calls
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5301 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'actionpack/lib/action_controller')
-rw-r--r--actionpack/lib/action_controller/filters.rb31
1 files changed, 29 insertions, 2 deletions
diff --git a/actionpack/lib/action_controller/filters.rb b/actionpack/lib/action_controller/filters.rb
index fc409dfa18..83275bb5a6 100644
--- a/actionpack/lib/action_controller/filters.rb
+++ b/actionpack/lib/action_controller/filters.rb
@@ -248,7 +248,10 @@ module ActionController #:nodoc:
# The passed <tt>filters</tt> will be appended to the filter_chain and
# will execute before the action on this controller is performed.
def append_before_filter(*filters, &block)
- append_filter_to_chain(filters, :before, &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?
end
# The passed <tt>filters</tt> will be prepended to the filter_chain and
@@ -263,7 +266,10 @@ module ActionController #:nodoc:
# The passed <tt>filters</tt> will be appended to the array of filters
# that run _after_ actions on this controller are performed.
def append_after_filter(*filters, &block)
- prepend_filter_to_chain(filters, :after, &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?
end
# The passed <tt>filters</tt> will be prepended to the array of filters
@@ -597,6 +603,27 @@ 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: