¿Cómo se puede borrar una entrada individual de un rubí en la sesión de rieles?
-
22-08-2019 - |
Pregunta
En el rubí en los carriles cuando se hace session[:foo] = nil
que deja una entrada llamada :foo
en el objeto de sesión. ¿Cómo puede deshacerse de esa sola entrada del objeto de sesión?
Solución
En realidad no es una manera de conseguir eliminar un valor de la sesión. Al igual que RichH dijo que la variable de sesión es una instancia de CGI :: Sesión. Cuando algo así como entrar en session[:foo]
que está buscando realmente ese símbolo en una variable de instancia @data
en el objeto de sesión. Esa variable de datos es un hash.
EDIT: Hay una variable de instancia de datos en la clase CGI :: Sesión. Si vas a la documentos y miras el código fuente para el método []=
verá que hay un miembro @data
.
Así que para eliminar session[:foo]
todo lo que tiene que hacer es que el acceso @data
variables desde el interior de la sesión
session.data[:foo]
Ahora, para eliminarla:
session.data.delete :foo
Una vez hecho esto, el no debe haber más foo en la variable de sesión.
Otros consejos
Parece que la versión más simple que funciona . Todas las tiendas (galleta, Archivo, ActiveRecord, ...) utilizan AbstractStore::SessionHash
como el objeto que contiene los datos, las diferentes tiendas proporcionan sólo los medios para cargar y guardar las instancias AbstractStore::SessionHash
.
AbstractStore::SessionHash
hereda de Hash
, así que esto difiere con el método Hash#delete
:
session.delete(:key_to_delete)
A medida que la sesión es un Rubí CGI :: Session y no un hash, llamando a eliminar en realidad eliminar sesión. Eliminar no toma ningún parámetro. - este es mi que está recibiendo el "número incorrecto de argumentos (1 o 0)" cuando intenta lo que sugiere hyuan
La forma generalmente aceptada para borrar una entrada de sesión es con la sesión [foo] = nil como sugieres. Está lejos de ser ideal, pero declaraciones como sesiones [foo] .nil? se comportará como se esperaba.
Me gustaría que se comportó como un hash normales ... pero no es así.