Comment puis-je savoir quand «rafraîchir» mon object de modèle dans Rails?

Voici une partie d’un test d’intégration que j’ai:

user = User.first assert !user.is_active? get confirm_email_user_url(user),:confirmId => user.mail_confirmation_hash assert_equal response.status,200 # because confirm_email_user_url modifies the activation state of the object user = User.first assert_equal user.state,"activated" 

J’ai passé la dernière heure à le déboguer :). Dans ma version initiale, je ne réinitialisais pas l’ user après avoir accédé à confirmation_email_user_url, et l’état était toujours inactive même si l’utilisateur était activé.

Comment savoir si je devrais “recharger” (en l’absence d’un meilleur nom) mon object modèle? Que dois-je appeler pour le faire?

Vous devez appeler user.reload chaque fois que les données ont été modifiées dans la firebase database.

Dans votre code ci-dessus, l’object “user” est créé en mémoire à partir des données extraites de la firebase database par User.first . Ensuite, il semble que votre confirm_email_user_url modifie la firebase database . L’object ne le sait pas jusqu’à ce que vous le reload , ce qui ré-acquiert les données de la firebase database.

Je ne suis pas sûr qu’il existe un moyen programmatique de savoir quand vous aurez besoin de recharger l’object, mais en tant que développeur, vous devez être conscient de ce qui se passe et gérer de manière appropriée. Dans la plupart de mes expériences (ce qui est quelque peu limité), ceci n’est qu’un problème lors des tests. En production, il n’est pas habituel qu’un object soit modifié dans la firebase database lorsqu’il est chargé en mémoire. Ce qui se produit habituellement, c’est que l’object en mémoire est modifié puis enregistré dans la firebase database (par exemple, user.email = "foo@bar.com" suivi de user.save ). Je suppose que si vous aviez une application très active où de nombreux utilisateurs pouvaient modifier quelque chose en peu de temps, vous devriez faire attention à cela.

Btw. Cela ne fonctionne pas vraiment lorsque vous faites des choses sur le modèle comme Report.count . Après des tentatives sans fin de réinitialiser les informations de la colonne ou d’obtenir une instance du premier / dernier enregistrement et de la recharger, la seule chose qui m’a aidé à reconnecter la firebase database entre les comptes comme ceci:

 initial_count = Report.count # do something, like invoking a rake task that imports the reports, .. Report.connection.reconnect! final_count = Report.count 

Cela a fonctionné pour Rails 2.3.8+, je ne connais pas les versions 3+.