2009-11-18 5 views
0

J'utilise la session Rails pour stocker un cookie_jar que je reçois de Mechanize. Cela me permet d'appeler un webservice et de maintenir les cookies qu'il renvoie.La session Rails a besoin de "inspect" pour être appelée

La classe prend une session dans son constructeur, donc je passe dans la session Rails. Puis, quand je l'appelle le service, je charge le cookie_jar (si j'ai une) comme:

agent = WWW::Mechanize.new 
agent.cookie_jar = YAML.load(@session[COOKIE_JAR]) if @session.has_key? COOKIE_JAR 

Une fois que je suis fait faire l'appel, je stocke le nouveau cookie_jar comme:

@session[COOKIE_JAR] = agent.cookie_jar.to_yaml 

Bien que j'adorerais juste stocker le "agent", il ne peut pas être sérialisé (et ne peut donc pas aller dans la session). Voici la partie funky: si j'appelle "session.inspect" dans mon constructeur de classes (ou à tout moment avant de vérifier si la session a la clé que je cherche), tout fonctionne bien. Supprimez l'appel à "session.inspect" et cela ne fonctionne plus.

Quelqu'un sait-il pourquoi la session Rails se comporte de cette façon?

Répondre

3

Essayez quelque chose comme ceci:

cj = @session[COOKIE_JAR] 
agent.cookie_jar = YAML.load(cj) unless cj.nil? 

Vous avez peut-être vaincu quelques rails magiques méta-programmation en n'insistant sur le fait que vous donner une chaîne réelle. Les sessions sont des objets semblables à Hash, mais pas vraiment un Hash.

Mise à jour: la recherche de l'API docs avec la source, ce n'est pas Méta mais la logique tout simplement:

# File actionpack/lib/action_controller/session/abstract_store.rb, line 27 
27:   def [](key) 
28:   load! unless @loaded 
29:   super 
30:   end 

SessionHash est dérivés de Hash mais seulement quelques méthodes obtenir l'emballage de charge paresseux et has_key? ne sont pas l'un d'eux.

Questions connexes