Rails 4会话不会跨请求持久化

时间:2016-03-14 20:23:38

标签: ruby-on-rails ruby session ruby-on-rails-4 ruby-on-rails-3.2

My Rails 3.2应用程序有一个名为LaunchController的控制器,它为其他Web应用程序提供api,以便它们可以嵌入在我的应用程序中生成和评分的测验。

当外部应用程序发布到LaunchController时,LaunchController#create使用OAuth进行身份验证,缓存一个知道外部应用程序的对象@tool,将缓存密钥存储在会话session[:launch_tool_cache_key]中并重定向到另一个呈现测验的控制器AttemptsController#new。当用户提交答案时,AttemptsControllert #start会对他们的测验进行评分并使用@tool将评分发布回外部应用程序。

3.2中一切正常。

上周我(终于!)将我的应用程序升级到Rails 4.2。我对迁移的其余部分进行了排序,现在应用程序正在开发中。除了这个过程。

问题在于持久化session[:launch_tool_cache_key]包含我用来从缓存中检索序列化@tool的密钥,以便我可以将成绩发送回外部应用程序。我的日志显示缓存密钥存储在LaunchController中,但在重定向到AttemptsController#new后,会话密钥消失了。

我尝试过的事情:

  • 评论protect_from_forgery
  • 添加skip_before_filter :verify_authenticity_token

1 个答案:

答案 0 :(得分:1)

将对象保存到会话密钥可能会出现问题。看这里

Rails session not persisting after redirects

此问题与您的问题类似。

如果是这样,您似乎最好将@tool存储到数据库中(例如可能是Redis),将会议密钥存储到会话中,并在重定向后通过密钥检索它。

如果这没有帮助,请提供一些更详细的解释(可能包含一些代码)