从Rails中的任何位置访问“会话密钥”cookie名称

我们正在构建一个用于在iframe Facebook应用程序中使用的Rails插件,并且我们需要检查是否已经设置了Rail的会话ID cookie。

默认情况下,此cookie名为_myprojectname_session ,我们需要找出的是cookie本身的实际名称。 因此,如果没有设置,我们可以进行一些重定向以确保设置cookie。

我们如何从任何地方访问该死的名称? 或者至少从控制器内部?

Rails.application.config.session_options[:key] 

我找到了解决方案。 在Rails 2.3.2中,至少在config/initializers/session_store.rb中设置的会话密钥如下:

 ActionController::Base.session = { :key => '_myapp_session', :secret => '[...]' } 

你可以读取这样的值:

 ActionController::Base.session_options[:key] 

Base.sessionBase.session_options ,没有多大意义,这让我头疼… lol

要从视图或控制器中访问会话cookie的名称,您可以说:

 request.session_options[:session_key] 

然后访问该cookie的原始值,如果没有设置为空数组,则使用:

 request.cookies[ request.session_options[:session_key] ] 

cookie名称(aka session_key)在config/environment.rb文件中设置。

  config.action_controller.session = { :session_key => '_project_session', :secret => 'long-secret-key' } 

根据我的经验,如果密钥中有下划线,IE SOMETIMES不会设置cookie。 换句话说,使用’projectsession’而不是’_project_session’。

我认为会话密钥存储在一个名为ENV_SESSION_KEY的变量中

另请注意,此错误会影响某些版本的Rails 2.x中的session_options周围的测试: https : //rails.lighthouseapp.com/projects/8994/tickets/2303-testrequest-doesnt-initialize-session_options

在Rails 3/4我使用这个:

 request.env["rack.request.cookie_hash"] 

这是一个包含当前用户的所有cookie的哈希,包括会话的cookie。 散列具有cookie的名称作为键,并且作为值的值是cookie的值

我无法解决如何在rails 3中做到这一点:-(

最终我把它放在config / initializers / session_store.rb中

 SESSION_KEY = '_myapp_session' MyApp::Application.config.session_store :cookie_store, :key => SESSION_KEY 

然后在需要的地方访问它,例如在视图中…

 <%= ::ENV_SESSION_KEY %>