2010-06-19 18 views
25

Aquí está mi código:¿Cómo borraría todas las sesiones de rieles?

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

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

El problema es cuando apago el servidor y volver a la aplicación, la sesión [: firsttimestart] sigue siendo falsa. De alguna manera almacena esta variable en mi sistema sin una fecha de vencimiento, por lo que no se llama a los iniglobals(). Intenté usar rake tmp: clear y no funcionó. ¿Cómo puedo borrar todas las sesiones que estoy usando en mi sistema cada vez que reinicio mi servidor?

Respuesta

23

Si va a guardar sus sesiones en una base de datos a continuación

rake db:sessions:clear 
+0

Aunque, esto puede no reducir el espacio en disco de su base de datos. En postgres, debo ejecutar lo siguiente después de las sesiones de borrado: 'VACUUM FULL ANALYZE;' y 'REINDEX table sessions;'. En otros dbs relacionales, puede que necesite optimizarlo también. –

+0

Consulte la respuesta de @ Yevgeniy debajo de – aceofspades

+0

Si no usa DB para almacenar sesiones, en Rails 3, solo necesita cambiar el token secreto de su aplicación y todas las sesiones se restablecerán. Para hacer esto, ejecute 'rake secret' en la línea de comando para generar un nuevo secreto y luego cópielo/péguelo en su archivo config/initializers/secret_token.rb. – Alberto

4

En primer lugar, nil no es == false, sin embargo, nada se evalúa como falsa. Inténtelo usted mismo si usted no cree:

irb(main):001:0> nil == false 
=> false 
irb(main):002:0> nil == nil 
=> true 

cual por supuesto significa:

irb(main):003:0> false.nil? 
=> false 

Puede limpiar el código de la siguiente manera, ya que parece que nunca se @firsttime se establece en true en cualquier lugar.

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

Por último, rake tmp: sesiones: clara sólo funcionará si está utilizando ActiveRecordStore, si está utilizando CookieStore (que es el valor por defecto). Luego deberá limpiar sus cookies, o usar reset_session.

45

Ya se trate de DB o una galleta tienda, utilizar rake tmp:sessions:clear

+0

Obviamente no puede funcionar para la tienda de cookies porque las sesiones se mantienen en el lado del cliente. – dolzenko

+0

@dolzenko solo se almacena una session_id en el lado del cliente. Todos los datos de la sesión se almacenan en el lado del servidor. Entonces no debería haber ninguna razón por la que no pueda borrar las sesiones de cookies del lado del servidor. – Nick

+1

@Nick esto solo es cierto para la tienda de sesión DB, cookie store almacena todo el lado del cliente, vea http://guides.rubyonrails.org/security.html#session-storage y http://api.rubyonrails.org/classes/ ActionDispatch/Session/CookieStore.html para obtener detalles – dolzenko

5

En los carriles 4, la respuesta aceptada (rake db:sessions:clear) ya no funciona debido a ActiveRecord :: SessionStore se extrajo en el active_record-session_store joya. (Ver here para mayor explicación)

Ahora puede instalar la gema active_record-session_store y utilizar rake db:sessions:clear como en Rails 3, o crear una tarea Rake personalizada que se ve así:

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 
2

estoy usando Rails 4 y la siguiente solución funcionó para mí, ya que no quiero ejecutar manualmente rake db:session:clear cada vez que inicie mi aplicación.

Dentro /config/initializer/session_store.rb añadir el siguiente

ActiveRecord::SessionStore::Session.delete_all 

Esto es lo mismo que el comando rake pero hecho a nivel de inicialización.

1

En los carriles 5 si se utiliza ActiveRecord:

ActiveRecord::SessionStore::Session.delete_all

o para más granular:

# For example schedule this once a day` 
ActiveRecord::SessionStore::Session.where(["updated_at < ?", 2.weeks.ago]).delete_all 
Cuestiones relacionadas