rails hacer ejemplos como session ruby-on-rails-2

session - hacer - ¿Cómo se borra una sola entrada de una sesión de Ruby on Rails?



como hacer un login en ruby on rails (3)

En ruby ​​on rails cuando se hace session[:foo] = nil deja una entrada llamada :foo en el objeto de la sesión. ¿Cómo puede deshacerse de esa única entrada del objeto de sesión?


Como la sesión es una sesión CGI::Session Ruby CGI::Session y no una función Hash, la eliminación de llamadas eliminará la sesión. Eliminar no toma parámetros: este es mi mensaje de "número incorrecto de argumentos (1 o 0)" cuando intentas lo que sugiere hyuan.

La forma generalmente aceptada de borrar una entrada de sesión es con la sesión [: foo] = nil como usted sugiere. Está lejos de ser ideal, pero las declaraciones como session [: foo] .nil? se comportará como se espera

Realmente me gustaría que se comportara como un Hash normal ... pero no es así.


En realidad, hay una manera de obtener eliminar un valor de la sesión. Como RichH dijo que la variable de sesión es una instancia de CGI :: Session. Cuando ingrese algo así como session[:foo] en realidad está buscando ese símbolo en una variable de instancia @data en el objeto de sesión. Esa variable de datos es un hash.

EDITAR: Hay una variable de instancia de datos en la clase CGI :: Session. Si va a los docs y mira el código fuente del método []= , verá que hay un miembro @data .

Así que para eliminar la session[:foo] todo lo que tienes que hacer es acceder a la variable @data desde el interior de la sesión

session.data[:foo]

Ahora para eliminarlo:

session.data.delete :foo

Una vez que hagas esto, no debería haber más foo en tu variable de sesión.


Parece que la versión más simple funciona . Todas las tiendas (Cookie, File, ActiveRecord, ...) usan AbstractStore::SessionHash como el objeto que contiene los datos, las diferentes tiendas proporcionan solo los medios para cargar y guardar las instancias de AbstractStore::SessionHash .

AbstractStore::SessionHash hereda de Hash , por lo que difiere al método Hash#delete :

session.delete(:key_to_delete)