Доступ к сессии в Sinatra Middleware - PullRequest
4 голосов
/ 02 февраля 2012

Я работаю над проектом Sinatra и установил некоторые переменные в сеансе для дальнейшего использования.

Сценарий, для которого мне нужна помощь, заключается в том, что я хочу получить доступ к объекту сеанса в классе промежуточного программного обеспечения. Я использую Warden для аутентификации.

Я хочу сделать нечто подобное ниже в классе Middleware:

class MyMiddleware
    def initialize(app, options={})
        @app = app
    end

    def call(env)
        puts "#{session.inspect}" 
    end
end

Есть ли возможность сделать это?

Мысли

1 Ответ

8 голосов
/ 02 февраля 2012

Вы не можете использовать метод Sinatra session в промежуточном программном обеспечении Rack, но вы можете получить доступ к сеансу напрямую через хеш env.

Убедитесь, что промежуточное программное обеспечение сеанса находится перед промежуточным программным обеспечением (поэтому в Sinatra enable :sessions должно быть до use MyMiddleware), тогда сеанс доступен через ключ 'rack.session':

class MyMiddleware
  def initialize(app, options={})
    @app = app
  end

  def call(env)
    puts env['rack.session'].inspect
    @app.call(env)
  end
end

Вы можете предпочесть использовать объект Rack::Request, чтобы упростить доступ к сеансу и другим частям хеша env:

def call(env)
  request = Rack::Request.new(env)
  puts request.session.inspect
  # other uses of request without needing to know what keys of env you need
  @app.call(env)
end
...