2008-12-13 10 views
2

Le stockage d'objets complexes ou profonds dans la session Ramaze est rompu?

J'ai rencontré des problèmes vraiment étranges en stockant des objets personnalisés en session. J'ai remarqué que seuls les attributs sur les objets immédiatement stockés dans la session étaient en cours de mise à jour. Toutefois, si ces objets contenaient des références à d'autres objets, les objets référencés n'étaient pas mis à jour si les objets immédiats contenus dans la session n'avaient pas été modifiés pendant la requête.

Ce problème n'est apparu pour moi lors de l'utilisation Ramaze :: FileCache en tant que backend de ma session de mise en cache. Je crois que le problème est masqué ou non un problème lors de l'utilisation de sessions en mémoire.

J'ai découvert le problème est dû au fait d'une "copie superficielle" dans la session logique trouvés dans Ramaze :: Session de Hash # method_missing (lib/Ramaze/cours/séance/hash.rb).

Comme un test rapide pour m'assurer que ma pensée était correcte, j'ai commenté le "contrôle de différence", forçant essentiellement la session à mettre à jour à chaque fois.

def method_missing(*args, &block) 
    old = @hash.dup 
    result = @hash.send(*args, &block) 
    #unless old == @hash 
     Cache.sessions[@session.session_id] = self 
    #end 
    result 
    end 

Ce petit problème a résolu mon problème. Maintenant mes questions sont:

  1. est-ce une solution sûre et raisonnable?
  2. Devrais-je éviter de stocker des objets complexes/profonds en session?
  3. Y a-t-il quelque chose qui me manque?

Répondre

2

Ce problème a été résolu dans la dernière version de Ramaze (2009.04), veuillez déposer un correctif au Ramaze issue tracker si le problème persiste.