Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 会话不会在Rails 4中持续_Ruby On Rails_Ruby_Session_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 会话不会在Rails 4中持续

Ruby on rails 会话不会在Rails 4中持续,ruby-on-rails,ruby,session,ruby-on-rails-4,Ruby On Rails,Ruby,Session,Ruby On Rails 4,更新: 我确定我可以在其他操作中更改会话,但是如果我在POST请求中设置会话,它不会持续。如果我将操作从POST更改为GET,则会话将持续 原始问题: 我有一个Rails 4.2.0.rc3应用程序。每当用户登录时,会话将分配给该用户的id。但是,当我运行current\u user方法时,会话不会持续。我在secret.yml文件中有一个secret\u key\u base。这是我的助手 module SessionsHelper def sign_in(user) sessio

更新:

我确定我可以在其他操作中更改会话,但是如果我在
POST
请求中设置会话,它不会持续。如果我将操作从
POST
更改为
GET
,则会话将持续

原始问题:

我有一个Rails 4.2.0.rc3应用程序。每当用户登录时,会话将分配给该用户的id。但是,当我运行
current\u user
方法时,会话不会持续。我在
secret.yml
文件中有一个
secret\u key\u base
。这是我的助手

module SessionsHelper
  def sign_in(user)
    session[:id] = user.id

    puts "signing in" * 100

    puts session[:id].inspect
  end

  def signed_in?
    current_user.present?
  end


  def current_user
    puts "checking session" * 100

    puts session[:id].inspect

    Avatar.find_by(id: session[:id])
  end
end

在我的日志文件中,我看到设置了
会话[:id]
。当运行另一个操作并调用
当前用户
方法时,
会话[:id]
为零。出了什么问题,我该如何解决?

不确定这是否是您的问题,但我记得在升级到rails 4.1(form 4.0)时看到了这一点

这是该文档的链接和部分。我认为这只适用于4.1而不是4.0

3.5在Rails 4.1之前创建的cookie序列化程序应用程序使用封送处理将cookie值序列化为已签名和加密的值 饼干罐。如果您想在应用程序中使用新的基于JSON的格式 应用程序中,可以添加具有以下内容的初始值设定项文件 内容:

Rails.application.config.action\u dispatch.cookies\u serializer=:hybrid 这将透明地迁移已序列化的现有封送处理 将cookie转换为新的基于JSON的格式

当使用:json或:hybrid序列化程序时,您应该注意这一点 所有Ruby对象都可以序列化为JSON。例如,日期和时间 对象将被序列化为字符串,哈希将有它们的键 严格化

类CookiesController2014年3月20日星期四 将\u重定向到操作:“读取\u cookie”结束 def read_cookie cookies.encrypted[:expiration_date]#=>“2014-03-20”end建议您只存储简单数据(字符串和数字) 在饼干里。如果必须存储复杂对象,则需要 在读取后续系统上的值时手动处理转换 请求

如果您使用cookie会话存储,这将应用于会话 还有flash散列


嗯,由你的更新触发,这只发生在帖子上,我不完全记得一些事情

  • Rails具有CSRF保护,但默认情况下,它仅应用于POST,而不是GET

  • 在CSRF故障的情况下,解除Rails CSRF保护逻辑将静默地使用新会话,而不是引发新会话。(我个人认为这是一个糟糕的违约选择)

我不知道这是不是真的发生了

为了找到答案,你想告诉你的Rails应用程序在CSRF故障时实际引发异常,以使其在响亮的情况下失败,而不是静默地使用新的孤立会话

在您的
app/controllers/application\u controller.rb
中,查找行
protect\u from\u forgery
,并更改为
protect\u from\u forgery with::exception
,告诉Rails在CSRF故障时实际启动。(实际上,看起来Rails 4.x应用程序现在是用这个新版本的产品线生成的,但是如果你有一个从3.x升级的应用程序,那么它就不会是了。
Rails新生成的
Rails版本中的更改万岁了)

如果您在演示测试用例中遇到异常,那么知道问题是什么,您可以找到适当的解决方案:要么使用适当的CSRF保护发出POST请求,要么关闭该操作的CSRF保护。如果是API类型的请求,您可能不需要CSRF保护

有关此类问题的更多背景资料,请参阅:


这些听起来像是你的问题吗?

也许问题在于你正在使用
self.current\u user
@current\u user
来引用相同的东西。同样的代码在Rails 3中也起到了作用。我想知道是什么原因导致了Rails的变化。也许是与线程安全性变化有关的原因?将数据存储到助手模块中似乎会产生一些意想不到的副作用。我已将该模块简化为仅分配和检查会话,但它仍会产生相同的结果。我不认为问题出在
self
@current\u user
上。你是如何存储会话的?嗯。我试过了,但没有成功。仍然产生错误。谢谢你的帮助,就这样。我在表单中添加了一个csrf令牌,它可以正常工作。谢谢