Ruby on rails 停止清除会话

Ruby on rails 停止清除会话,ruby-on-rails,ruby,ruby-on-rails-3,devise,Ruby On Rails,Ruby,Ruby On Rails 3,Devise,似乎当用户通过标准DeVICE控制器注销时,DeVICE会破坏整个会话存储,而不仅仅是它自己的数据。有没有办法避免这种行为?我还有其他不相关的数据需要保存 session[:my_var] = "123" 通过设计注销 puts session[:my_var] # => nil sessioncontroller的destroy方法包含以下行: signed_out = Devise.sign_out_all_scopes ? sign_out : sign_out(resource

似乎当用户通过标准DeVICE控制器注销时,DeVICE会破坏整个会话存储,而不仅仅是它自己的数据。有没有办法避免这种行为?我还有其他不相关的数据需要保存

session[:my_var] = "123"
通过设计注销

puts session[:my_var]
# => nil

sessioncontroller
destroy
方法包含以下行:

signed_out = Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
sign\u out\u all\u scopes
方法调用
warden.logout
而不带任何参数,而
sign\u out
方法调用
warden.logout(scope)

注销的文档
⁴ 方法说明:

结论:
注销
在指定特定范围时应保留会话。然而,我看不出有什么办法可以做到这一点
sign\u out\u始终首先调用所有作用域
,并且只有在无法注销任何用户时才会返回
false

我建议您使用他们的问题跟踪程序或开发您自己的身份验证解决方案。Rails现在提供了这些功能,现在人们似乎倾向于后者,以避免遇到这些问题


²

³


除了马修斯。声明

signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
考虑到使用多个角色登录的可能性,这可能是最好的常规注销声明。对于您的情况,如果您的用户只是作为一个角色登录,并且您希望在注销时保留会话的其余部分,那么最简单的方法是:

$ git clone git://github.com/plataformatec/devise.git
$ cd devise
$ git branch my_devise
$ git checkout my_devise
在编辑器中打开app/controllers/designe/sessions_controller.rb。在方法中销毁,替换

signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))

保存并退出编辑器,然后执行以下操作

$ git commit -am "remove only warden data from session on logout, preserve other data."
在项目的GEM文件中,描述要设计的依赖项

gem 'devise', :path => "[YOUR PATH]/devise", :branch => "my_devise"

您可以覆盖Desive的SessionController,就像我保存购物车时所做的那样:

会话\u controller.rb

class SessionsController < Devise::SessionsController

    def destroy
        order_id = session[:order_id] 
        super  
        session[:order_id] = order_id
    end

end
devise_for :users, :controllers => { :sessions => "sessions" }

在Desive的最新版本中,无需覆盖会话控制器,您只需使用:

config.sign_out_all_scopes = false

designe.rb
文件中,以获得所需的行为。

感谢您的所有努力,Matheus。这似乎已在代码中更改,并且您的链接中没有提交哈希。今天,
design.sign\u out\u all\u scopes
是一个布尔值:非常简单的解决方案!感谢您的贡献。简单的解决方案,您不会干扰Desive的工作,因此意外行为的风险非常低。我希望Desive使用timeoutable时,这一点能够起作用。此方法永远不会命中,然后:(
devise_for :users, :controllers => { :sessions => "sessions" }
config.sign_out_all_scopes = false