Définition d'une variable de session dans un modèle
Avec Rails 3, Comment pouvez-vous définir une variable de session dans un modèle
session[:cannot_reason] = "no such item"
J'aimerais définir le ci-dessus dans mon modèle d'utilisateur. Maintenant j'ai cette erreur:
undefined local variable or method `session' for #<User:0x00000102eb9c38>
Idées? Grâce
source d'informationauteur AnApprentice
Vous devez vous connecter pour publier un commentaire.
Il y a un peu inutile de fret-culting quant à savoir si ou non les modèles doivent avoir accès à des données de session. Je pense que c'est ridicule, puisque session est vraiment juste une autre forme de persistant de stockage (quoique pour un délai beaucoup plus court) et, dans les Rails, il me semble bien avoir votre domaine d'objet également être en mesure de persister lui-même.
Cela dit, la pas très propre façon de le faire serait de passer la session de hachage comme un paramètre dans la méthode qui vous permettra d'opérer sur elle:
Dans votre contrôleur, vous serait alors de faire quelque chose comme:
En imaginant que
mymethod
est de mettre en œuvre une logique métier, cela va modifier lasession
de hachage de façon appropriée. Vous n'avez pas à passer lesession
de hachage sur le contrôleur parce que Ruby passe autour de références à des objets (comme une table de Hachage)--des modifications sont apportées de façon destructrice de ces objets référencés.Un mot de conseils: L'exemple ci-dessus, à mon avis, est puant. C'est parce que
User
est un ActiveRecord modèle qui (je suppose) persiste à une base de données et nous allons ajouter un comportement qui le rend aussi persister à un cookie de session. Pour moi, cela viole SRP et doit être évitée.La façon dont je voudrais mettre en œuvre ce serait pour extraire le stockage de session logique à un domaine distinct de l'objet qui encapsule la raison de son existence. Peut-être, par exemple,
count
n'est pas seulement un "nombre", c'est le nombre total d'éléments dans la temporaire de l'utilisateur panier.Maintenant votre contrôleur devrait ressembler à ceci:
Ce qui est beaucoup plus révélateur et ouvre la porte d'une manière évidente d'abstraction de la session de code d'accès si vous vous trouvez à l'aide de stockage de session d'un lot. Notez également que j'ai des espaces de données dans la session de hachage (mais à ne pas montrer cette mise en œuvre). Je vous recommande de le faire de sorte que vous ne faites pas un pas sur vos propres orteils lors de l'ajout d'autres données.
En bref, vous ne pouvez pas. De par leur conception, les modèles n'ont pas accès aux cookies de la session. Si vous accéder aux éléments de la session à partir de votre modèle, vous aurez besoin de transmettre explicitement à partir du contrôleur.
L'objet de session n'est pas visible dans les modèles. Soit le passer en paramètre à une méthode de votre modèle (à mon humble avis mauvais) ou définir une méthode dans votre modèle, qui renvoie ce que vous voulez et ensuite de les stocker dans la session (à partir de votre contrôleur).
Dans votre contrôleur