123456789_123456789_123456789_123456789_123456789_

Class: ActionDispatch::Request::Session

Do not use. This class is for internal use only.
Relationships & Source Files
Namespace Children
Classes:
Inherits: Object
Defined in: actionpack/lib/action_dispatch/request/session.rb

Overview

Session is responsible for lazily loading the session from store.

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(by, req, enabled: true) ⇒ Session

[ GitHub ]

  
# File 'actionpack/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)

Creates a session hash, merging the properties of the previous session if any.

[ GitHub ]

  
# File 'actionpack/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)

[ GitHub ]

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

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

.disabled(req)

[ GitHub ]

  
# File 'actionpack/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)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 33

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

.set(req, session)

[ GitHub ]

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

def self.set(req, session)
  req.set_header ENV_SESSION_KEY, session
end

Instance Attribute Details

#empty?Boolean (readonly)

[ GitHub ]

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

def empty?
  load_for_read!
  @delegate.empty?
end

#enabled?Boolean (readonly)

[ GitHub ]

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

def enabled?
  @enabled
end

#exists?Boolean (readonly)

[ GitHub ]

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

#loaded?Boolean (readonly)

[ GitHub ]

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

def loaded?
  @loaded
end

Instance Method Details

#[](key)

Returns value of the key stored in the session or nil if the given key is not found in the session.

[ GitHub ]

  
# File 'actionpack/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)

Writes given value to given key of the session.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 152

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

#clear

Clears the session.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 158

def clear
  load_for_delete!
  @delegate.clear
end

#delete(key)

Deletes given key from the session.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 191

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

#destroy

[ GitHub ]

  
# File 'actionpack/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)

Returns the nested value specified by the sequence of keys, returning nil if any intermediate step is nil.

[ GitHub ]

  
# File 'actionpack/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)

[ GitHub ]

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

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

#fetch(key, default = Unspecified, &block)

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
[ GitHub ]

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

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 132

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

#id

[ GitHub ]

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

def id
  options.id(@req)
end

#id_was

[ GitHub ]

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

def id_was
  load_for_read!
  @id_was
end

#include?(key)

Alias for #has_key?.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 137

alias :include? :has_key?

#inspect

[ GitHub ]

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

#key?(key)

Alias for #has_key?.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 136

alias :key? :has_key?

#keys

Returns keys of the session as ::Array.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 140

def keys
  load_for_read!
  @delegate.keys
end

#load! (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 268

def load!
  if enabled?
    @id_was_initialized = true unless exists?
    id, session = @by.load_session @req
    options[:id] = id
    @delegate.replace(session.stringify_keys)
    @id_was = id unless @id_was_initialized
  end
  @id_was_initialized = true
  @loaded = true
end

#load_for_delete! (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 264

def load_for_delete!
  load! if enabled? && !loaded?
end

#load_for_read! (private)

[ GitHub ]

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

def load_for_read!
  load! if !loaded? && exists?
end

#load_for_write! (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 256

def load_for_write!
  if enabled?
    load! unless loaded?
  else
    raise DisabledSessionError, "Your application has sessions disabled. To write to the session you must first configure a session store"
  end
end

#merge!(hash)

Alias for #update.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 188

alias :merge! :update

#options

[ GitHub ]

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

def options
  Options.find @req
end

#to_h

Alias for #to_hash.

[ GitHub ]

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

alias :to_h :to_hash

#to_hash Also known as: #to_h

Returns the session as ::Hash.

[ GitHub ]

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

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

#update(hash) 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"}
[ GitHub ]

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

Returns values of the session as ::Array.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/request/session.rb', line 146

def values
  load_for_read!
  @delegate.values
end