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.



74
75
76
77
78
79
80
81
# 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
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, 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



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.



110
111
112
113
114
115
116
117
118
119
# File 'lib/action_dispatch/request/session.rb', line 110

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.



150
151
152
153
# File 'lib/action_dispatch/request/session.rb', line 150

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

#clearObject

Clears the session.



156
157
158
159
# File 'lib/action_dispatch/request/session.rb', line 156

def clear
  load_for_delete!
  @delegate.clear
end

#delete(key) ⇒ Object

Deletes given key from the session.



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

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

#destroyObject



95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/action_dispatch/request/session.rb', line 95

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.



123
124
125
126
127
# File 'lib/action_dispatch/request/session.rb', line 123

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



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

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

#empty?Boolean

Returns:

  • (Boolean)


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

def empty?
  load_for_read!
  @delegate.empty?
end

#enabled?Boolean

Returns:

  • (Boolean)


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

def enabled?
  @enabled
end

#exists?Boolean

Returns:

  • (Boolean)


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

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


203
204
205
206
207
208
209
210
# File 'lib/action_dispatch/request/session.rb', line 203

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)


130
131
132
133
# File 'lib/action_dispatch/request/session.rb', line 130

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

#idObject



83
84
85
# File 'lib/action_dispatch/request/session.rb', line 83

def id
  options.id(@req)
end

#inspectObject



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

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.



138
139
140
141
# File 'lib/action_dispatch/request/session.rb', line 138

def keys
  load_for_read!
  @delegate.keys
end

#loaded?Boolean

Returns:

  • (Boolean)


226
227
228
# File 'lib/action_dispatch/request/session.rb', line 226

def loaded?
  @loaded
end

#merge!(other) ⇒ Object



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

def merge!(other)
  load_for_write!
  @delegate.merge!(other)
end

#optionsObject



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

def options
  Options.find @req
end

#to_hashObject Also known as: to_h

Returns the session as Hash.



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

def to_hash
  load_for_read!
  @delegate.dup.delete_if { |_, v| v.nil? }
end

#update(hash) ⇒ Object

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


178
179
180
181
# File 'lib/action_dispatch/request/session.rb', line 178

def update(hash)
  load_for_write!
  @delegate.update hash.stringify_keys
end

#valuesObject

Returns values of the session as Array.



144
145
146
147
# File 'lib/action_dispatch/request/session.rb', line 144

def values
  load_for_read!
  @delegate.values
end