Ответ 1
Если вы сохраняете свои сеансы в db, тогда
rake db:sessions:clear
Вот мой код:
if session[:firsttimestart].nil?
else
@firsttime = false
end
if @firsttime == true
initglobals()
end
session[:firsttimestart]=false
Проблема в том, что когда я выключу сервер и вернусь к приложению, сеанс [: firsttimestart] по-прежнему является ложным. Он каким-то образом сохраняет эту переменную в моей системе без истечения срока действия, поэтому iniglobals() не вызывается. Я попытался использовать rake tmp: clear, и это не сработало. Как я могу очистить все сеансы, которые я использую в своей системе, каждый раз, когда я перезапускаю свой сервер?
Если вы сохраняете свои сеансы в db, тогда
rake db:sessions:clear
Будь то БД или хранилище файлов cookie, используйте rake tmp:sessions:clear
В 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
Во-первых, 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.
Я использую Rails 4, и для меня работало следующее решение, так как я не хочу запускать вручную rake db:session:clear
каждый раз при запуске приложения.
Внутри/config/initializer/session_store.rb добавьте следующее
ActiveRecord::SessionStore::Session.delete_all
Это то же самое, что и команда rake, но выполняется на уровне инициализатора.
Лучше всего изменить секретный ключ при развертывании, все файлы cookie будут признаны недействительными
технически, вы должны предоставить его уже через переменную среды.
http://guides.rubyonrails.org/security.html#custom-secrets
для задачи рейка, это выглядит как новый
rails tmp:clear
В 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
Чтобы представить альтернативное решение: вы можете изменить secret_key_base
- если аутентификация выполняется в другом приложении.
По крайней мере, для сеансов, хранящихся в файлах cookie, вы можете просто изменить ключ хранилища сеансов:
Инициализаторы/session_store.rb:
Rails.application.config.session_store :cookie_store, key: '_my_new_session_key'
Согласно Rails API:... изменение вашего secret_key_base сделает все существующие сессии недействительными
https://api.rubyonrails.org/v5.2.1/classes/ActionDispatch/Session/CookieStore.html