diff options
author | Jeremy Kemper <jeremy@bitsweat.net> | 2008-07-08 23:38:18 -0700 |
---|---|---|
committer | Jeremy Kemper <jeremy@bitsweat.net> | 2008-07-09 10:42:30 -0700 |
commit | 0ce7fe5308337ae0b0394ae4c18b59cf64e33b38 (patch) | |
tree | ae106f5f63be3ebc2863b533dab076fd1ce92b3e /actionpack | |
parent | ce4a1bb8538bd7cc5ee3cbf1156dc587482a7839 (diff) | |
download | rails-0ce7fe5308337ae0b0394ae4c18b59cf64e33b38.tar.gz rails-0ce7fe5308337ae0b0394ae4c18b59cf64e33b38.tar.bz2 rails-0ce7fe5308337ae0b0394ae4c18b59cf64e33b38.zip |
Don't repeatedly convert only/except options
Diffstat (limited to 'actionpack')
-rw-r--r-- | actionpack/lib/action_controller/filters.rb | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/actionpack/lib/action_controller/filters.rb b/actionpack/lib/action_controller/filters.rb index c3f1de971e..fc63890d13 100644 --- a/actionpack/lib/action_controller/filters.rb +++ b/actionpack/lib/action_controller/filters.rb @@ -94,7 +94,7 @@ module ActionController #:nodoc: map! do |filter| if filters.include?(filter) new_filter = filter.dup - new_filter.options.merge!(options) + new_filter.update_options!(options) new_filter else filter @@ -104,6 +104,11 @@ module ActionController #:nodoc: end class Filter < ActiveSupport::Callbacks::Callback #:nodoc: + def initialize(kind, method, options = {}) + super + update_options! options + end + def before? self.class == BeforeFilter end @@ -116,6 +121,18 @@ module ActionController #:nodoc: self.class == AroundFilter end + # Make sets of strings from :only/:except options + def update_options!(other) + if other + convert_only_and_except_options_to_sets_of_strings(other) + if other[:skip] + convert_only_and_except_options_to_sets_of_strings(other[:skip]) + end + end + + options.update(other) + end + private def should_not_skip?(controller) if options[:skip] @@ -127,9 +144,9 @@ module ActionController #:nodoc: def included_in_action?(controller, options) if options[:only] - Array(options[:only]).map { |o| o.to_s }.include?(controller.action_name) + options[:only].include?(controller.action_name) elsif options[:except] - !Array(options[:except]).map { |o| o.to_s }.include?(controller.action_name) + !options[:except].include?(controller.action_name) else true end @@ -138,6 +155,14 @@ module ActionController #:nodoc: def should_run_callback?(controller) should_not_skip?(controller) && included_in_action?(controller, options) && super end + + def convert_only_and_except_options_to_sets_of_strings(opts) + [:only, :except].each do |key| + if values = opts[key] + opts[key] = Array(values).map(&:to_s).to_set + end + end + end end class AroundFilter < Filter #:nodoc: |