Rails会话没有保存

时间:2013-08-24 19:13:40

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

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

当试图做某事时 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设置会话然后显示的同一个虚拟机上创建了另一个应用程序,并且工作正常。
  • 会话存储的内容根据用户的操作略有不同,但通常只包含一个用户ID(只是一个整数),偶尔也会多一点 - (我首先注意到这一点在尝试通过时表现出来)来自OAuth gem的OAuth令牌。)
  • 我注意到如果VM的系统时钟落后于Windows 7主机时钟,则用户ID会话保持不变。这会导致其他问题,尤其是OAuth,但似乎只是某个时间问题。我尝试过从环境/ development.rb中删除时区等操作,但这没有帮助。

3 个答案:

答案 0 :(得分:4)

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

  • 会话size over 4K限制(显然是这种情况)。

      

    如果您尝试存储超过4K的数据,则会引发CookieOverflow。

  •   
  请记住,如果您将对象存储在会话中,则该对象在存储之前会先进行序列化,并且其大小会更大。有关特定问题的一般问题和可能解决方案的更多信息,here

  • CSRF protection的问题。

      

    如果安全令牌与预期不符,则会话   将被重置

  •   
  修改:要检查是否为CSRF案例,您可以按照下面的Abdo评论暂时停用protect_from_forgery

中的ApplicationController

答案 1 :(得分:2)

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

答案 2 :(得分:0)

来自:Railscasts Episode 415 Upgrading to Rails 4

  

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

     

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

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