如何在Rack中间件中使用cookie?

时间:2011-03-17 18:00:38

标签: ruby-on-rails ruby ruby-on-rails-3 cookies rack

我正在使用Ruby on Rails 3,我想在Rack中间件中使用cookies.signed方法。我需要这样做,因为我想直接在中间件中对用户进行身份验证,而不是在before_filter文件中使用application_controller.rb

例如,如果我以这种方式在控制器中使用该方法:

cookies.signed[:user_id']

我得到了

--- 
- 1 # This is the id of the current signed in user
- a64ee3asdtjhcc7b35fcb280956be00ba27f94d48dfe4291c06db7d57577d5893 # This is the cookie salt

但如果我在Rack中间件(同一应用程序)中使用它,那么这样:

request = Rack::Request.new(env)
request.cookies.signed[:user_id']

我得到了

NoMethodError
undefined method `signed' for #<Hash:0x00000103333d40>

那么,如何才能在中间件中使用该方法?如何获取用户ID以便我可以对其进行身份验证?


也许我必须包含\ extend,例如,ActionDispatch ......如果是这样,怎么做?

2 个答案:

答案 0 :(得分:19)

看起来你应该能够做到这一点:

  request = ActionDispatch::Request.new(env)
  request.cookie_jar.signed[:user_id] #=> 1

您可以在github上查看.../action_dispatch/middleware/cookies.rb,详细了解正在发生的事情。

答案 1 :(得分:5)

已初始化的cookie jar存在于env哈希。

env['action_dispatch.cookies'].signed[:user_id]

上面的示例相当于在ActionController::Base实例上下文中调用以下内容:

cookies.signed[:user_id]