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。例如,日期和时间
对象将被序列化为字符串,哈希将有它们的键
严格化
类CookiesController嗯,由你的更新触发,这只发生在帖子上,我不完全记得一些事情
- Rails具有CSRF保护,但默认情况下,它仅应用于POST,而不是GET
- 在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令牌,它可以正常工作。谢谢