Rails会话没有保存

我正在将Rails应用程序从Rails 2直接升级到Rails 4.我正在使用带有CookieStore的新/config/initializers/session_store.rb文件,但出于某种原因我的会话没有保存。

当尝试按照render :text => "#{request.session_options[:id]}"方式执行某些操作时render :text => "#{request.session_options[:id]}"每次刷新时都会获得一个新的会话ID。

我尝试过不同的浏览器,所有人都应该接受cookie。

我不知道是怎么回事。 为什么这些会议不会持续?!

编辑:谢谢大家的建议。 这里有一些信息,还有一些我注意到的事情:

  • 首先,关于我的设置 – 我在Windows 7机器上的Ubuntu VM上使用Rails 4 / Ruby 2到RVM运行服务器。
  • 虽然我正在从Rails 2升级,但这只适用于models / controllers / views / etc – 我为所有支持基础架构生成了一个新的Rails 4应用程序。
  • 我在JUST设置会话然后显示的同一个VM上创建了另一个应用程序,并且工作正常。
  • 会话存储的内容根据用户的行为略有不同,但通常只包含一个用户ID(只是一个整数),偶尔会多一点 – (我首先注意到这在尝试传递OAuth令牌时表现出来)来自OAuth的gem。)
  • 我注意到如果VM的系统时钟落后于Windows 7主机时钟,则用户ID会话保持不变。 这会导致其他问题,尤其是OAuth,但似乎只是某个时间问题。 我尝试过从我的环境/ development.rb中删除时区,但这没有帮助。

作为一般答案,有几个可能的问题

  • 会话大小超过4K限制(显然是这种情况)。

如果您尝试存储超过4K的数据,则会引发CookieOverflow。 请记住,如果您将对象存储在会话中,则该对象在存储之前会先进行序列化,并且其大小会更大。 有关特定问题的一般问题和可能解决方案的更多信息,请参见此处 。

  • CSRF保护问题。

如果安全令牌与预期的不匹配,则会重置会话 编辑:要检查它是否是CSRF案例,您可以按照下面的Abdo评论暂时禁用ApplicationControllerprotect_from_forgery

我有类似的症状。 事实certificate这是因为我添加了rails-api gem,它完全打破了会话节省。

来自: Railscasts第415集升级到Rails 4

在秘密令牌初始化程序中,我们需要进行一次更改配置。 在Rails 4中,此文件中的配置选项已从secret_token重命名为secret_key_base。 我们需要在从Rails 3转换时指定这两个选项,但是一旦我们成功迁移了应用程序,我们就可以删除secret_token选项。 最好为secret_key_base使用不同的令牌。

这是必要的,因为我们正在从存储在客户端上的序列化cookie转移到加密的cookie。 这可以防止用户轻松查看其会话cookie的内容。

这一集包括一系列关于从2升级到4升的非常好的技巧,我能够成功地使用本教程。