aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJamis Buck <jamis@37signals.com>2005-10-11 01:53:31 +0000
committerJamis Buck <jamis@37signals.com>2005-10-11 01:53:31 +0000
commit0efeeba7802b3e5137cd62cbb6fcf303a8a238a2 (patch)
tree578b686ed35f4dfdbbc9276b97a755655c8416d3
parent9025e5d47ff82951a78c5ca90bca77e4cd3b5bef (diff)
downloadrails-0efeeba7802b3e5137cd62cbb6fcf303a8a238a2.tar.gz
rails-0efeeba7802b3e5137cd62cbb6fcf303a8a238a2.tar.bz2
rails-0efeeba7802b3e5137cd62cbb6fcf303a8a238a2.zip
Speed improvement for session_options. #2287. [skaes@web.de]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2527 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--actionpack/CHANGELOG2
-rw-r--r--actionpack/lib/action_controller/session_management.rb47
2 files changed, 31 insertions, 18 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index dcf160414f..00bb2f3fd7 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Speed improvement for session_options. #2287. [skaes@web.de]
+
* Make cacheing binary files friendly with Windows. #1975. [Rich Olson]
* Convert boolean form options form the tag_helper. #809. [Michael Schuerig <michael@schuerig.de>]
diff --git a/actionpack/lib/action_controller/session_management.rb b/actionpack/lib/action_controller/session_management.rb
index b0a457932d..6752d66e85 100644
--- a/actionpack/lib/action_controller/session_management.rb
+++ b/actionpack/lib/action_controller/session_management.rb
@@ -77,26 +77,36 @@ module ActionController #:nodoc:
write_inheritable_array("session_options", [options])
end
+ def cached_session_options
+ @session_options ||= read_inheritable_attribute("session_options") || []
+ end
+
def session_options_for(request, action) #:nodoc:
- options = {}
+ if (session_options = cached_session_options).empty?
+ {}
+ else
+ options = {}
- action = action.to_s
- (read_inheritable_attribute("session_options") || []).each do |opts|
- next if opts[:if] && !opts[:if].call(request)
- if opts[:only] && opts[:only].include?(action)
- options.merge!(opts)
- elsif opts[:except] && !opts[:except].include?(action)
- options.merge!(opts)
- elsif !opts[:only] && !opts[:except]
- options.merge!(opts)
+ action = action.to_s
+ session_options.each do |opts|
+ next if opts[:if] && !opts[:if].call(request)
+ if opts[:only] && opts[:only].include?(action)
+ options.merge!(opts)
+ elsif opts[:except] && !opts[:except].include?(action)
+ options.merge!(opts)
+ elsif !opts[:only] && !opts[:except]
+ options.merge!(opts)
+ end
+ end
+
+ if options.empty? then options
+ else
+ options.delete :only
+ options.delete :except
+ options.delete :if
+ options[:disabled] ? false : options
end
end
-
- options.delete :only
- options.delete :except
- options.delete :if
-
- options[:disabled] ? false : options
end
end
@@ -108,8 +118,9 @@ module ActionController #:nodoc:
private
def clear_persistant_model_associations #:doc:
- session = @session.instance_variable_get("@data")
- session.each { |key, obj| obj.clear_association_cache if obj.respond_to?(:clear_association_cache) } if session
+ if session = @session.instance_variable_get("@data")
+ session.each { |key, obj| obj.clear_association_cache if obj.respond_to?(:clear_association_cache) }
+ end
end
end
end