JeuWeb - Crée ton jeu par navigateur
[Rails] Find ne trouve pas… - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Rails] Find ne trouve pas… (/showthread.php?tid=5598)



[Rails] Find ne trouve pas… - Viciousity - 28-07-2011

Bonjour,

Depuis cette après midi je me rend compte que mon application ne tourne plus du point de vue de la session utilisateur.
En effet, il semble que la méthode find ne fasse plus de comparaison correcte.

Je m'explique, une fois logué, je met en session(cookie) le contenu d'un champ persistence_token de ma table de donnée.

Ainsi je retrouve mon utilisateur et ses infos par le biais de ce cookie.

# Auth de l'utilisateur.
def sign_in user
cookies.permanent[:persistence] = user.persistence_token
redirect_to root_path, :notice => "You've been signed in."
end

# Recup de l'utilisateur pour les vues et controlleurs.
def current_user
@current_user ||= User.find_by_persistence_token(cookies[:persistence])
end

Le problème est que le cookies contient bien ma chaine "persistence_token" mais que active_record ne semble pas retrouver l'utilisateur qui correspond.

J'ai donc essayer dans la console de faire :

User.where(:persistence_token => User.first.persistence_token)
=> [] # pas de résultat ce qui est illogique ...
u = User.find(1)
=> [USER informations]
u.persistence_token == User.find(1).persistence_token
=> true # Logique
User.where(:persistence_token =>u.persistence_token)
=> [] # Pas de résultat ...

Franchement je ne comprend pas ...
Je suis ruby 1.9.2, Rails 3.1-RC5 (cependant j'ai essayé en RC4 -> RC1 sans résultat)


RE: Rails : Problème avec find - Sephi-Chan - 28-07-2011

Que contient le log pour l'appel à current_user ?


RE: Rails : Problème avec find - Viciousity - 28-07-2011

Ben rien du tout d'anormal ... Le log de la requete SQL et la réponse qui est nulle, c'est sa qui est étrange ...


RE: Rails : Problème avec find - Sephi-Chan - 28-07-2011

Rails 3.1 étant testé et en RC depuis plusieurs mois, je ne pense pas qu'un bug aussi gros puisse passer inaperçu.
Je pense donc que l'erreur vient de toi. As-tu activé le nouveau système d'entity map ?

En tout cas, j'aimerai bien voir :
  • Tout le log généré par le chargement d'une page, pour m'assurer qu'il n'y a pas d'update ninja du token ou je ne sais quoi de cet ordre ;
  • Le SQL généré pour l'appel à current_user et le retour de cette commande directement depuis ton client SQL ;
  • Le retour de la requête SQL "SELECT id, persistence_token FROM users;", pour m'assurer que Rails devrait bien trouver quelque chose ;
  • Eventuellement ton modèle User ;

Voilou ! Smile


RE: Rails : Problème avec find - Viciousity - 29-07-2011

La réponse est trouvée.

Elle vient de la méthode utilisée pour la génération aléatoire.
ActiveSupport::SecureRandom.base64(64).class
=> String
ActiveSupport::SecureRandom.hex(64).class
=> String

Cependant ActiveR ne semble pas vouloir comparer da chaine en Hex...
Pourquoi? Je ne sais pas et je ne comprend pas car meme avec un "to_s", cela ne fixe pas le probleme.


RE: Rails : Problème avec find - Sephi-Chan - 29-07-2011

Les chaînes contiennent des caractères hexa mais sont des chaînes classique.
J'utilise également SecureRandom.hex pour mes tokens et ça marche très bien.

Je pense que le problème vient d'ailleurs. Cela dit, je ne peux pas t'aider si tu ne veux pas donner d'information. Smile