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.



76
77
78
79
80
81
82
83
84
85
# File 'lib/action_dispatch/request/session.rb', line 76

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.



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

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



43
44
45
# File 'lib/action_dispatch/request/session.rb', line 43

def self.delete(req)
  req.delete_header ENV_SESSION_KEY
end

.disabled(req) ⇒ Object



29
30
31
32
33
# File 'lib/action_dispatch/request/session.rb', line 29

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



35
36
37
# File 'lib/action_dispatch/request/session.rb', line 35

def self.find(req)
  req.get_header ENV_SESSION_KEY
end

.set(req, session) ⇒ Object



39
40
41
# File 'lib/action_dispatch/request/session.rb', line 39

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.



114
115
116
117
118
119
120
121
122
123
# File 'lib/action_dispatch/request/session.rb', line 114

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.



154
155
156
157
# File 'lib/action_dispatch/request/session.rb', line 154

def []=(key, value)
  load_for_write!
  @delegate[key.to_s] = value
end

#clearObject

Clears the session.



160
161
162
163
# File 'lib/action_dispatch/request/session.rb', line 160

def clear
  load_for_delete!
  @delegate.clear
end

#delete(key) ⇒ Object

Deletes given key from the session.



193
194
195
196
# File 'lib/action_dispatch/request/session.rb', line 193

def delete(key)
  load_for_delete!
  @delegate.delete key.to_s
end

#destroyObject



99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/action_dispatch/request/session.rb', line 99

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



127
128
129
130
131
# File 'lib/action_dispatch/request/session.rb', line 127

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



244
245
246
# File 'lib/action_dispatch/request/session.rb', line 244

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

#empty?Boolean

Returns:

  • (Boolean)


239
240
241
242
# File 'lib/action_dispatch/request/session.rb', line 239

def empty?
  load_for_read!
  @delegate.empty?
end

#enabled?Boolean

Returns:

  • (Boolean)


91
92
93
# File 'lib/action_dispatch/request/session.rb', line 91

def enabled?
  @enabled
end

#exists?Boolean

Returns:

  • (Boolean)


229
230
231
232
233
# File 'lib/action_dispatch/request/session.rb', line 229

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


212
213
214
215
216
217
218
219
# File 'lib/action_dispatch/request/session.rb', line 212

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)


134
135
136
137
# File 'lib/action_dispatch/request/session.rb', line 134

def has_key?(key)
  load_for_read!
  @delegate.key?(key.to_s)
end

#idObject



87
88
89
# File 'lib/action_dispatch/request/session.rb', line 87

def id
  options.id(@req)
end

#id_wasObject



248
249
250
251
# File 'lib/action_dispatch/request/session.rb', line 248

def id_was
  load_for_read!
  @id_was
end

#inspectObject



221
222
223
224
225
226
227
# File 'lib/action_dispatch/request/session.rb', line 221

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.



142
143
144
145
# File 'lib/action_dispatch/request/session.rb', line 142

def keys
  load_for_read!
  @delegate.keys
end

#loaded?Boolean

Returns:

  • (Boolean)


235
236
237
# File 'lib/action_dispatch/request/session.rb', line 235

def loaded?
  @loaded
end

#optionsObject



95
96
97
# File 'lib/action_dispatch/request/session.rb', line 95

def options
  Options.find @req
end

#to_hashObject Also known as: to_h

Returns the session as Hash.



166
167
168
169
# File 'lib/action_dispatch/request/session.rb', line 166

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"}


182
183
184
185
186
187
188
189
# File 'lib/action_dispatch/request/session.rb', line 182

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.



148
149
150
151
# File 'lib/action_dispatch/request/session.rb', line 148

def values
  load_for_read!
  @delegate.values
end