Class: ActionDispatch::Request::Session
- Inherits:
-
Object
- Object
- ActionDispatch::Request::Session
- Defined in:
- lib/action_dispatch/request/session.rb
Overview
Session is responsible for lazily loading the session from store.
Defined Under Namespace
Classes: Options
Constant Summary collapse
- DisabledSessionError =
:nodoc:
Class.new(StandardError)
- ENV_SESSION_KEY =
:nodoc:
Rack::RACK_SESSION
- ENV_SESSION_OPTIONS_KEY =
:nodoc:
Rack::RACK_SESSION_OPTIONS
- Unspecified =
Singleton object used to determine if an optional param wasn’t specified.
Object.new
Class Method Summary collapse
-
.create(store, req, default_options) ⇒ Object
Creates a session hash, merging the properties of the previous session if any.
- .delete(req) ⇒ Object
- .disabled(req) ⇒ Object
- .find(req) ⇒ Object
- .set(req, session) ⇒ Object
Instance Method Summary collapse
-
#[](key) ⇒ Object
Returns value of the key stored in the session or
nil
if the given key is not found in the session. -
#[]=(key, value) ⇒ Object
Writes given value to given key of the session.
-
#clear ⇒ Object
Clears the session.
-
#delete(key) ⇒ Object
Deletes given key from the session.
- #destroy ⇒ Object
-
#dig(*keys) ⇒ Object
Returns the nested value specified by the sequence of keys, returning
nil
if any intermediate step isnil
. - #each(&block) ⇒ Object
- #empty? ⇒ Boolean
- #enabled? ⇒ Boolean
- #exists? ⇒ Boolean
-
#fetch(key, default = Unspecified, &block) ⇒ Object
Returns value of the given key from the session, or raises
KeyError
if can’t find the given key and no default value is set. -
#has_key?(key) ⇒ Boolean
(also: #key?, #include?)
Returns true if the session has the given key or false.
- #id ⇒ Object
- #id_was ⇒ Object
-
#initialize(by, req, enabled: true) ⇒ Session
constructor
A new instance of Session.
- #inspect ⇒ Object
-
#keys ⇒ Object
Returns keys of the session as Array.
- #loaded? ⇒ Boolean
- #options ⇒ Object
-
#to_hash ⇒ Object
(also: #to_h)
Returns the session as Hash.
-
#update(hash) ⇒ Object
(also: #merge!)
Updates the session with given Hash.
-
#values ⇒ Object
Returns values of the session as Array.
Constructor Details
#initialize(by, req, enabled: true) ⇒ Session
Returns a new instance of Session.
74 75 76 77 78 79 80 81 82 83 |
# File 'lib/action_dispatch/request/session.rb', line 74 def initialize(by, req, enabled: true) @by = by @req = req @delegate = {} @loaded = false @exists = nil # We haven't checked yet. @enabled = enabled @id_was = nil @id_was_initialized = false end |
Class Method Details
.create(store, req, default_options) ⇒ Object
Creates a session hash, merging the properties of the previous session if any.
17 18 19 20 21 22 23 24 25 |
# File 'lib/action_dispatch/request/session.rb', line 17 def self.create(store, req, ) session_was = find req session = Request::Session.new(store, req) session.merge! session_was if session_was set(req, session) Options.set(req, Request::Session::Options.new(store, )) session end |
.delete(req) ⇒ Object
41 42 43 |
# File 'lib/action_dispatch/request/session.rb', line 41 def self.delete(req) req.delete_header ENV_SESSION_KEY end |
.disabled(req) ⇒ Object
27 28 29 30 31 |
# File 'lib/action_dispatch/request/session.rb', line 27 def self.disabled(req) new(nil, req, enabled: false).tap do Session::Options.set(req, Session::Options.new(nil, { id: nil })) end end |
.find(req) ⇒ Object
33 34 35 |
# File 'lib/action_dispatch/request/session.rb', line 33 def self.find(req) req.get_header ENV_SESSION_KEY end |
.set(req, session) ⇒ Object
37 38 39 |
# File 'lib/action_dispatch/request/session.rb', line 37 def self.set(req, session) req.set_header ENV_SESSION_KEY, session end |
Instance Method Details
#[](key) ⇒ Object
Returns value of the key stored in the session or nil
if the given key is not found in the session.
112 113 114 115 116 117 118 119 120 121 |
# File 'lib/action_dispatch/request/session.rb', line 112 def [](key) load_for_read! key = key.to_s if key == "session_id" id&.public_id else @delegate[key] end end |
#[]=(key, value) ⇒ Object
Writes given value to given key of the session.
152 153 154 155 |
# File 'lib/action_dispatch/request/session.rb', line 152 def []=(key, value) load_for_write! @delegate[key.to_s] = value end |
#clear ⇒ Object
Clears the session.
158 159 160 161 |
# File 'lib/action_dispatch/request/session.rb', line 158 def clear load_for_delete! @delegate.clear end |
#delete(key) ⇒ Object
Deletes given key from the session.
191 192 193 194 |
# File 'lib/action_dispatch/request/session.rb', line 191 def delete(key) load_for_delete! @delegate.delete key.to_s end |
#destroy ⇒ Object
97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/action_dispatch/request/session.rb', line 97 def destroy clear if enabled? = self. || {} @by.send(:delete_session, @req, .id(@req), ) # Load the new sid to be written with the response. @loaded = false load_for_write! end end |
#dig(*keys) ⇒ Object
Returns the nested value specified by the sequence of keys, returning nil
if any intermediate step is nil
.
125 126 127 128 129 |
# File 'lib/action_dispatch/request/session.rb', line 125 def dig(*keys) load_for_read! keys = keys.map.with_index { |key, i| i.zero? ? key.to_s : key } @delegate.dig(*keys) end |
#each(&block) ⇒ Object
242 243 244 |
# File 'lib/action_dispatch/request/session.rb', line 242 def each(&block) to_hash.each(&block) end |
#empty? ⇒ Boolean
237 238 239 240 |
# File 'lib/action_dispatch/request/session.rb', line 237 def empty? load_for_read! @delegate.empty? end |
#enabled? ⇒ Boolean
89 90 91 |
# File 'lib/action_dispatch/request/session.rb', line 89 def enabled? @enabled end |
#exists? ⇒ Boolean
227 228 229 230 231 |
# File 'lib/action_dispatch/request/session.rb', line 227 def exists? return false unless enabled? return @exists unless @exists.nil? @exists = @by.send(:session_exists?, @req) end |
#fetch(key, default = Unspecified, &block) ⇒ Object
Returns value of the given key from the session, or raises KeyError
if can’t find the given key and no default value is set. Returns default value if specified.
session.fetch(:foo)
# => KeyError: key not found: "foo"
session.fetch(:foo, :bar)
# => :bar
session.fetch(:foo) do
:bar
end
# => :bar
210 211 212 213 214 215 216 217 |
# File 'lib/action_dispatch/request/session.rb', line 210 def fetch(key, default = Unspecified, &block) load_for_read! if default == Unspecified @delegate.fetch(key.to_s, &block) else @delegate.fetch(key.to_s, default, &block) end end |
#has_key?(key) ⇒ Boolean Also known as: key?, include?
Returns true if the session has the given key or false.
132 133 134 135 |
# File 'lib/action_dispatch/request/session.rb', line 132 def has_key?(key) load_for_read! @delegate.key?(key.to_s) end |
#id ⇒ Object
85 86 87 |
# File 'lib/action_dispatch/request/session.rb', line 85 def id .id(@req) end |
#id_was ⇒ Object
246 247 248 249 |
# File 'lib/action_dispatch/request/session.rb', line 246 def id_was load_for_read! @id_was end |
#inspect ⇒ Object
219 220 221 222 223 224 225 |
# File 'lib/action_dispatch/request/session.rb', line 219 def inspect if loaded? super else "#<#{self.class}:0x#{(object_id << 1).to_s(16)} not yet loaded>" end end |
#keys ⇒ Object
Returns keys of the session as Array.
140 141 142 143 |
# File 'lib/action_dispatch/request/session.rb', line 140 def keys load_for_read! @delegate.keys end |
#loaded? ⇒ Boolean
233 234 235 |
# File 'lib/action_dispatch/request/session.rb', line 233 def loaded? @loaded end |
#options ⇒ Object
93 94 95 |
# File 'lib/action_dispatch/request/session.rb', line 93 def Options.find @req end |
#to_hash ⇒ Object Also known as: to_h
Returns the session as Hash.
164 165 166 167 |
# File 'lib/action_dispatch/request/session.rb', line 164 def to_hash load_for_read! @delegate.dup.delete_if { |_, v| v.nil? } end |
#update(hash) ⇒ Object Also known as: merge!
Updates the session with given Hash.
session.to_hash
# => {"session_id"=>"e29b9ea315edf98aad94cc78c34cc9b2"}
session.update({ "foo" => "bar" })
# => {"session_id"=>"e29b9ea315edf98aad94cc78c34cc9b2", "foo" => "bar"}
session.to_hash
# => {"session_id"=>"e29b9ea315edf98aad94cc78c34cc9b2", "foo" => "bar"}
180 181 182 183 184 185 186 187 |
# File 'lib/action_dispatch/request/session.rb', line 180 def update(hash) unless hash.respond_to?(:to_hash) raise TypeError, "no implicit conversion of #{hash.class.name} into Hash" end load_for_write! @delegate.update hash.to_hash.stringify_keys end |
#values ⇒ Object
Returns values of the session as Array.
146 147 148 149 |
# File 'lib/action_dispatch/request/session.rb', line 146 def values load_for_read! @delegate.values end |