Class: ActionDispatch::Request::Session

Inherits:
Object
  • Object
show all
Defined in:
actionpack/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 'actionpack/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 'actionpack/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 'actionpack/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 'actionpack/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 'actionpack/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 'actionpack/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 'actionpack/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 Also known as: store

Writes given value to given key of the session.



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

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

#clearObject

Clears the session.



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

def clear
  load_for_delete!
  @delegate.clear
end

#delete(key) ⇒ Object

Deletes given key from the session.



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

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 'actionpack/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 'actionpack/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



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

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

#empty?Boolean

Returns:



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

def empty?
  load_for_read!
  @delegate.empty?
end

#enabled?Boolean

Returns:



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

def enabled?
  @enabled
end

#exists?Boolean

Returns:



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

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


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

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:



134
135
136
137
# File 'actionpack/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 'actionpack/lib/action_dispatch/request/session.rb', line 87

def id
  options.id(@req)
end

#id_wasObject



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

def id_was
  load_for_read!
  @id_was
end

#inspectObject



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

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 'actionpack/lib/action_dispatch/request/session.rb', line 142

def keys
  load_for_read!
  @delegate.keys
end

#loaded?Boolean

Returns:



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

def loaded?
  @loaded
end

#optionsObject



95
96
97
# File 'actionpack/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.



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

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


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

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 'actionpack/lib/action_dispatch/request/session.rb', line 148

def values
  load_for_read!
  @delegate.values
end