¿Cómo se puede borrar una entrada individual de un rubí en la sesión de rieles?

StackOverflow https://stackoverflow.com/questions/684457

  •  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?

¿Fue útil?

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í.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top