Comment effacer une seule entrée d'une session Ruby on Rails ?
-
22-08-2019 - |
Question
En rubis sur rails en faisant session[:foo] = nil
il laisse une entrée nommée :foo
dans l'objet session.Comment pouvez-vous vous débarrasser de cette entrée unique de l’objet session ?
La solution
En fait, il existe un moyen de supprimer une valeur de la session.Comme RichH l'a dit, la variable de session est une instance CGI :: Session.Quand entrez quelque chose comme session[:foo]
il s'agit en fait de rechercher ce symbole dans un @data
variable d'instance dans l'objet de session.Cette variable de données est un hachage.
MODIFIER: Il existe une variable d'instance de données dans la classe CGI::Session.Si vous allez au documents et regardez le code source du []=
méthode, vous verrez qu'il y a un @data
membre.
Donc à supprimer session[:foo]
tout ce que vous avez à faire c'est d'y accéder @data
variable depuis l'intérieur de la session
session.data[:foo]
Maintenant pour le supprimer :
session.data.delete :foo
Une fois que vous faites cela, il ne devrait plus y avoir de foo dans votre variable de session.
Autres conseils
On dirait que la version la plus simple fonctionne.Tous les magasins (Cookie, File, ActiveRecord, ...) utilisent AbstractStore::SessionHash
comme l'objet qui contient les données, les différents magasins fournissent uniquement les moyens de charger et de sauvegarder les données. AbstractStore::SessionHash
instances.
AbstractStore::SessionHash
hérite de Hash
, donc cela s'en remet au Hash#delete
méthode:
session.delete(:key_to_delete)
Comme la Session est un Ruby CGI : Session et non un hachage, appeler delete supprimera en fait la session.La suppression ne prend aucun paramètre - c'est mon message, vous recevez le message "mauvais nombre d'arguments (1 ou 0)" lorsque vous essayez ce que suggère hyuan.
La manière généralement acceptée d'effacer une entrée de session consiste à utiliser session[:foo] = nil comme vous le suggérez.C'est loin d'être idéal, mais des déclarations comme session[:foo].nil?se comportera comme prévu.
J'aimerais vraiment qu'il se comporte comme un hachage normal...mais ce n'est pas le cas.