Как бы я очистил все сессии рельсов? - PullRequest
29 голосов
/ 19 июня 2010

Вот мой код:

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

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

Проблема в том, что когда я выключаю сервер и возвращаюсь к приложению, сессия [: firsttimestart] все еще ложна.Каким-то образом эта переменная хранится в моей системе без даты истечения срока действия, поэтому iniglobals () не вызывается.Я попытался использовать rake tmp: clear, и это не сработало.Как я могу очистить все сеансы, которые используются в моей системе каждый раз, когда я перезагружаю свой сервер?

Ответы [ 8 ]

48 голосов
/ 11 июля 2012

Будь то БД или магазин печенья, используйте rake tmp:sessions:clear

25 голосов
/ 19 июня 2010

Если вы храните свои сессии в БД, тогда

rake db:sessions:clear
5 голосов
/ 03 июля 2014

В Rails 4 принятый ответ (rake db:sessions:clear) больше не работает, поскольку ActiveRecord :: SessionStore был извлечен в гем active_record-session_store. (См. здесь для дальнейшего объяснения)

Теперь вы можете установить гем active_record-session_store и использовать rake db:sessions:clear, как в Rails 3, или создать пользовательскую задачу 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
4 голосов
/ 19 июня 2010

Во-первых, 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: session: clear будет работать только в том случае, если вы используете ActiveRecordStore, если вы используете CookieStore (который используется по умолчанию). Тогда вам нужно будет очистить ваши куки или использовать reset_session.

2 голосов
/ 08 декабря 2017

В Rails 5, если используется ActiveRecord:

ActiveRecord::SessionStore::Session.delete_all

или более детально:

# For example schedule this once a day`
ActiveRecord::SessionStore::Session.where(["updated_at < ?", 2.weeks.ago]).delete_all
2 голосов
/ 17 октября 2016

Лучше всего изменить секретный ключ при развертывании, все куки будут признаны недействительными

технически, вы должны предоставлять его уже через переменную среды.

http://guides.rubyonrails.org/security.html#custom-secrets

для граблей, похоже, что новое -

rails tmp:clear  
2 голосов
/ 02 марта 2016

Я использую Rails 4, и следующее решение сработало для меня, так как я не хочу запускать rake db:session:clear каждый раз, когда запускаю приложение.

Внутри /config/initializer/session_store.rb добавьте следующее

ActiveRecord::SessionStore::Session.delete_all

Это то же самое, что и команда rake, но выполняется на уровне инициализатора.

0 голосов
/ 27 сентября 2018

Чтобы представить альтернативное решение: вы можете изменить secret_key_base - если аутентификация выполняется в другом приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...