2009-06-23 27 views
0

Ce que vous voulez accomplir, c'est: Je veux "synchroniser les navigateurs web". mon site dispose d'une "URL d'attente" où, lorsque le navigateur arrive, il attendra jusqu'à ce qu'un autre navigateur s'y rende, et les deux seront présentés avec un jeu semblable à un quiz.rails: comment détecter d'autres clients parcourant la même URL

À l'heure actuelle, l'URL d'attente appelle chaque seconde vers Rails pour vérifier si un autre joueur est arrivé à la partie. Comment dans le framework Rails peut-il détecter un client différent se connectant à la même URL?

Comme le contrôleur est recréé par demande ressemble à n'est pas l'endroit, pas la vue à coup sûr et le stockage dans le modèle semble vraiment maladroit.

En outre, après l'appariement j'ai besoin de vérifier et de comparer toutes les réponses des utilisateurs par paires afin en quelque sorte que l'information doit être conservée

Répondre

4

Ce que vous essayez de faire est de partager des informations entre les utilisateurs. Donc, la base de données ou memcached sont les plus sensibles.

Simplest: Je crée un objet ActiveRecord, peut-être appelé Quiz, les instances dont les gens se joignent en vertu d'aller à une URL, par exemple en utilisant les routes par défaut:

http://yoursite.com/quizes/join/3434 

Vous auriez besoin d'un ajax Poller poller pour avertir les autres; utilisez periodically_call_remote pour cela - vous pourriez utiliser render: nothing => true par défaut et restituer autre chose s'il y avait une erreur pour le garder efficace. Vous pouvez également utiliser la méthode de la fréquence comme base pour déterminer si les participants quittent également le quiz (par exemple, si la fréquence est égale à 1s, supposer que quelqu'un est parti s'ils n'ont pas effectué de ping après 5-10).

0

Je ne suis pas un expert en rails, mais puisque tout l'état réside dans votre base de données serait l'endroit pour garder cette information.

Vous pouvez conserver une table "utilisateurs en attente" et, dans la vue "URL d'attente", vérifier si l'utilisateur est déjà dans la table. Sinon, ajoutez-le à la table. Ensuite, vérifiez s'il y a un autre utilisateur en attente (peut-être y en a-t-il plus d'un?) Et si c'est le cas, associez-les et supprimez-les de la table. Une autre amélioration consisterait à conserver un horodatage pour chaque utilisateur dans la table "utilisateurs en attente", qui sera mis à jour dans la vue. Cela servirait de "keep-alive" qui vous permettra de détecter les utilisateurs qui ont quitté "l'attente". URL "ou fermé le navigateur.

1

En supposant que ces utilisateurs ne sont pas inscrits sur le site, vous n'avez pas le type d'identifiant que vous pouvez stocker. Je suggère d'utiliser la session. C'est un magasin de données par utilisateur. Par défaut, la session est stockée dans un cookie chiffré sur la machine de l'utilisateur. Cependant, vous pouvez utiliser ActiveRecord comme magasin de session et peut-être interroger directement cette table?

Stockez l'URL dans la session et effectuez une recherche plus tard. Vous pouvez normalement accéder à la session des utilisateurs en utilisant le hash de la session Rails mais peut-être (non testé) si vous avez créé un modèle appelé Session (ou quelque chose de plus spécifique comme WaitingGamers) qui utilisait la table des sessions. avoir besoin.

Je suppose que lorsque vous utilisez ActiveRecord comme magasin de session, les données de session sont stockées sous forme de hachage sérialisé. Utilisez Marshall pour revenir à un hachage régulier et trouver les données que vous avez stockées là-bas.

Questions connexes