V2.1: Sessions


Sessions are disabled by default. To enable sessions, add a config like the following to your app:

# config/app.rb

module Bookshelf
  class App < Hanami::App
    config.actions.sessions = :cookie, {
      key: "bookshelf.session",
      secret: settings.session_secret,
      expire_after: 60*60*24*365
    }
  end
end

For this to work, you will need to add a session_secret to your app settings. See settings for more details.

# config/settings.rb

module Bookshelf
  class Settings < Hanami::Settings
    setting :session_secret, constructor: Types::String
  end
end

Using sessions

With sessions enabled, actions can set and read values from the session using the response and request objects.


module Bookshelf
  module Actions
    module Books
      class Index < Bookshelf::Action
        def handle(request, response)
          # Setting a value in the session
          response.session[:user_id] = 1

          # Reading a value from the session
          request.session[:user_id] # => 1

          # Removing a value from the session
          request.session[:user_id] = nil
        end
      end
    end
  end
end

Session adapters

When configuring sessions, the first argument of the configuration is the adapter to use for session storage.

Specifying :cookie, as above, will use Rack::Session::Cookie for the session storage.

The name of the session adapter is the underscored version of the class name under Rack::Session namespace. Example: :cookie for Rack::Session::Cookie.

To use a different adapter, for example :redis, add the redis-rack gem and specify the adapter as :redis.

Custom storage technologies can be loaded via require "rack/session/#{ adapter_name }".

The second argument passed to sessions is a hash of options to be passed to the chosen adapter.