aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch
diff options
context:
space:
mode:
authorTrent Ogren <tedwardo2@gmail.com>2013-12-11 15:29:33 -0600
committerTrent Ogren <tedwardo2@gmail.com>2013-12-11 15:29:33 -0600
commitd0fc760d093c377e4bd697121af9bc4b047ae04c (patch)
tree46d74c1db11209116df671e78314fd5a9da6c9e8 /actionpack/lib/action_dispatch
parent5853c64a4ba77134b7a4ff942b7ae711cb7bcc46 (diff)
downloadrails-d0fc760d093c377e4bd697121af9bc4b047ae04c.tar.gz
rails-d0fc760d093c377e4bd697121af9bc4b047ae04c.tar.bz2
rails-d0fc760d093c377e4bd697121af9bc4b047ae04c.zip
Make ActionDispatch::Request::Session#fetch behave like Hash#fetch
Session#fetch was mutating the session when given a default argument and/or a block. Since Session duck-types as a Hash, it should behave like one in these cases.
Diffstat (limited to 'actionpack/lib/action_dispatch')
-rw-r--r--actionpack/lib/action_dispatch/request/session.rb16
1 files changed, 8 insertions, 8 deletions
diff --git a/actionpack/lib/action_dispatch/request/session.rb b/actionpack/lib/action_dispatch/request/session.rb
index 6d911a75f1..973627f106 100644
--- a/actionpack/lib/action_dispatch/request/session.rb
+++ b/actionpack/lib/action_dispatch/request/session.rb
@@ -7,6 +7,9 @@ module ActionDispatch
ENV_SESSION_KEY = Rack::Session::Abstract::ENV_SESSION_KEY # :nodoc:
ENV_SESSION_OPTIONS_KEY = Rack::Session::Abstract::ENV_SESSION_OPTIONS_KEY # :nodoc:
+ # Singleton object used to determine if an optional param wasn't specified
+ Unspecified = Object.new
+
def self.create(store, env, default_options)
session_was = find env
session = Request::Session.new(store, env)
@@ -127,15 +130,12 @@ module ActionDispatch
@delegate.delete key.to_s
end
- def fetch(key, default=nil)
- if self.key?(key)
- self[key]
- elsif default
- self[key] = default
- elsif block_given?
- self[key] = yield(key)
+ def fetch(key, default=Unspecified, &block)
+ load_for_read!
+ if default == Unspecified
+ @delegate.fetch(key.to_s, &block)
else
- raise KeyError
+ @delegate.fetch(key.to_s, default, &block)
end
end