2012-02-02 81 views
4

我正在Sinatra项目上工作,并在会话中设置了一些变量供以后使用。Sinatra中间件访问会话

我需要帮助的场景是我想访问中间件类中的会话对象。我正在使用监狱长进行身份验证。

我想要做的中间件类下面类似的东西:

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

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

是否有这样做的可能性?

想法?

回答

8

您不能在Rack中间件中使用Sinatra的session方法,但可以通过env散列直接访问会话。

确保会议中间件是中间件之前(因此在西纳特拉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 
+0

谢谢亚光。会给它一个镜头,让你知道结果。干杯。 – 2012-02-02 19:24:09