Class: ActionDispatch::Request::Session

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

Constructor Details

#initialize(by, req, enabled: true) ⇒ Session

Returns a new instance of Session.

[View source]

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.

[View source]

17
18
19
20
21
22
23
24
25
# File 'lib/action_dispatch/request/session.rb', line 17

def self.create(store, req, default_options)
  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, default_options))
  session
end

.delete(req) ⇒ Object

[View source]

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

[View source]

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

[View source]

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

[View source]

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.

[View source]

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.

[View source]

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

#clearObject

Clears the session.

[View source]

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.

[View source]

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

#destroyObject

[View source]

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?
    options = self.options || {}
    @by.send(:delete_session, @req, options.id(@req), options)

    # 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.

[View source]

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

[View source]

242
243
244
# File 'lib/action_dispatch/request/session.rb', line 242

def each(&block)
  to_hash.each(&block)
end

#empty?Boolean

Returns:

  • (Boolean)
[View source]

237
238
239
240
# File 'lib/action_dispatch/request/session.rb', line 237

def empty?
  load_for_read!
  @delegate.empty?
end

#enabled?Boolean

Returns:

  • (Boolean)
[View source]

89
90
91
# File 'lib/action_dispatch/request/session.rb', line 89

def enabled?
  @enabled
end

#exists?Boolean

Returns:

  • (Boolean)
[View source]

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
[View source]

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.

Returns:

  • (Boolean)
[View source]

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

#idObject

[View source]

85
86
87
# File 'lib/action_dispatch/request/session.rb', line 85

def id
  options.id(@req)
end

#id_wasObject

[View source]

246
247
248
249
# File 'lib/action_dispatch/request/session.rb', line 246

def id_was
  load_for_read!
  @id_was
end

#inspectObject

[View source]

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

#keysObject

Returns keys of the session as Array.

[View source]

140
141
142
143
# File 'lib/action_dispatch/request/session.rb', line 140

def keys
  load_for_read!
  @delegate.keys
end

#loaded?Boolean

Returns:

  • (Boolean)
[View source]

233
234
235
# File 'lib/action_dispatch/request/session.rb', line 233

def loaded?
  @loaded
end

#optionsObject

[View source]

93
94
95
# File 'lib/action_dispatch/request/session.rb', line 93

def options
  Options.find @req
end

#to_hashObject Also known as: to_h

Returns the session as Hash.

[View source]

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"}
[View source]

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

#valuesObject

Returns values of the session as Array.

[View source]

146
147
148
149
# File 'lib/action_dispatch/request/session.rb', line 146

def values
  load_for_read!
  @delegate.values
end