Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.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会话?_Ruby On Rails_Session - Fatal编程技术网

Ruby on rails 如何清除所有rails会话?

Ruby on rails 如何清除所有rails会话?,ruby-on-rails,session,Ruby On Rails,Session,这是我的密码: if session[:firsttimestart].nil? else @firsttime = false end if @firsttime == true initglobals() end session[:firsttimestart]=false 问题是,当我关闭服务器并返回应用程序时,会话[:firsttimestart]仍然为false。它以某种方式将此变量存储在我的系统中,没有过期日期,因此不会调用InGlobals()。我试图使用rake-t

这是我的密码:

if session[:firsttimestart].nil? 
else
  @firsttime = false
end

if @firsttime == true
  initglobals()
end
session[:firsttimestart]=false

问题是,当我关闭服务器并返回应用程序时,会话[:firsttimestart]仍然为false。它以某种方式将此变量存储在我的系统中,没有过期日期,因此不会调用InGlobals()。我试图使用rake-tmp:clear,但它不起作用。如何在每次重新启动服务器时清除系统中使用的所有会话?

如果将会话存储在数据库中,则

rake db:sessions:clear

首先,nil不是==false,但是,nil的计算结果为false。如果您不相信,请自己尝试:

irb(main):001:0> nil == false
=> false
irb(main):002:0> nil == nil
=> true
这当然意味着:

irb(main):003:0> false.nil?
=> false
您可以用以下方式清理代码,因为似乎@firsttime在任何地方都不会设置为true

unless session[:visited]
  session[:visited] = true
  initglobals
end

最后,rake-tmp:sessions:clear仅在您使用ActiveRecordStore和CookieStore(默认设置)时有效。然后您需要清理cookie,或者使用reset_session。

无论是DB还是cookie存储,都要使用
rake tmp:sessions:clear
在Rails 4中,接受的答案(
rake DB:sessions:clear
)不再有效,因为ActiveRecord::SessionStore被提取到
active_record-session_存储中。(更多解释请参见)

您现在可以安装
active\u record-session\u存储
gem并使用Rails 3中的
rake db:sessions:clear
,或者创建一个自定义的rake任务,如下所示:

namespace :db do
    namespace :sessions do
        desc "Clear ActiveRecord sessions"
        task :clear => :environment do
            sql = 'TRUNCATE sessions;'
            ActiveRecord::Base.connection.execute(sql)
        end
    end
end

我使用的是Rails 4,以下解决方案对我很有效,因为我不想每次启动应用程序时都手动运行
rake db:session:clear

在/config/initializer/session_store.rb内部添加以下内容

ActiveRecord::SessionStore::Session.delete_all

这与rake命令相同,但在初始值设定项级别执行。

最好是更改部署上的密钥,所有cookie都将无效

从技术上讲,您应该已经通过环境变量提供了一个

对于rake任务,看起来新任务是

rails tmp:clear  

在Rails 5中,如果使用ActiveRecord:

ActiveRecord::SessionStore::Session.delete\u all

或者对于更细粒度的:

# For example schedule this once a day`
ActiveRecord::SessionStore::Session.where(["updated_at < ?", 2.weeks.ago]).delete_all
#例如,每天安排一次`
ActiveRecord::SessionStore::Session.where([“更新时间<?”,2周前])。全部删除

提供另一种解决方案:您可以更改
密钥库
-如果身份验证在另一个应用程序中完成。

至少对于存储在cookie中的会话,您可以更改会话存储密钥:

初始化者/session_store.rb:

Rails.application.config.session_store :cookie_store, key: '_my_new_session_key'
根据Rails API:…更改您的密钥库将使所有现有会话无效

这将在使用rails API时清除缓存和所有会话,对于其他数据库任务,请使用:

rake --tasks

尽管如此,这可能不会缩小数据库磁盘空间。在postgres中,我需要在清除会话后运行以下操作:
VACUUM FULL ANALYZE
重新索引表会话。在其他关系数据库中,您可能也需要对其进行优化。请参阅下面的@Yevgeniy答案。如果您没有在Rails 3上使用数据库存储会话,那么您只需更改应用程序的秘密令牌,所有会话都将重置。要执行此操作,请在命令行上运行
rake secret
,生成一个新密码,然后将其复制/粘贴到您的config/initializers/secret_token.rb文件中。显然,cookie存储区无法工作,因为会话保存在客户端。@dolzenko客户端仅存储会话id。所有会话数据都存储在服务器端。所以不应该有任何理由不能从服务器端清除cookie会话。@Nick这只适用于DB会话存储,cookie存储客户端的所有内容,请参阅并获取详细信息。我不知道rails使用了这种非常非常规的策略,但看起来确实是正确的。这在放弃后救了我。我在console中尝试了这一点,它给了我一个错误,即NameError:uninitialized constant ActiveRecord::SessionStore。你知道这不起作用的原因吗?你可以用“会话”代替“ActiveRecord::SessionStore::Session”
rake --tasks