actualiser une page depuis le controller rails

39 views
Skip to first unread message

ziburudebian

unread,
Aug 5, 2016, 6:16:57 PM8/5/16
to Railsfrance
bonjour

je voudrais actualiser ma page web depuis ma fonction ruby :
sur la bouton 'start' de ma page web (slim), j'appelle une fonction (runexecution) de mon controller :
cette fonction fait une boucle infinie toutes les minutes et doit réactualiser le contenu de ma page (input par exemple) en fonction de resultat générées par ma fonction runexecution :
comment faire ? un render , ...auytre ideés ?

My config:
Linux debian 7
ruby 2.1
Rails 4.17
mysql 5

Julien Grillot

unread,
Aug 6, 2016, 3:33:34 AM8/6/16
to rails...@googlegroups.com
Bonjour,

Le plus simple qui me vienne en tête est que ce soit JavaScript qui
boucle toutes les minutes avec un setInterval pour faire un appel XHR
(ajax) qui récupère ce qui est calculé côté serveur.
> --
> --
> Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de
> Google Groups.
> Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse
> rails...@googlegroups.com
> Pour résilier votre abonnement envoyez un e-mail à l'adresse
> railsfrance...@googlegroups.com
> ---
> Vous recevez ce message, car vous êtes abonné au groupe Google Groupes
> "Railsfrance".
> Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le
> concernant, envoyez un e-mail à l'adresse
> railsfrance...@googlegroups.com.
> Pour obtenir davantage d'options, consultez la page
> https://groups.google.com/d/optout.

Simon Courtois

unread,
Aug 6, 2016, 8:42:58 AM8/6/16
to rails...@googlegroups.com, Julien Grillot
Bonjour,

Sur le principe avoir une méthode qui fait une boucle infinie sur le serveur est une très mauvaise idée car cela block un process. Imaginons que l'app soit hostée avec par exemple un maximum de 3 processes, il suffit d'ouvrir la page 3 fois pour que le serveur ne puisse plus répondre à personne.

Il serait préférable d'opter pour une solution JS qui va effectivement interroger le serveur de temps en temps pour une réponse à jour et qui sera calculée rapidement à la demande.

Maintenant si on veut se la jouer fancy on peut aussi penser à une solution à base de websockets, Rails 5 sorti il y a peu propose une solution clé-en-main appelée ActionCable.

@ziburudebian Quel est le besoin fonctionnel exact ? C'est pour l'application avec les indicateurs, etc ?

Bonne journée,

Simon Courtois
Pour plus d'options, visitez le site https://groups.google.com/d/optout .

Francis MILHAU

unread,
Aug 8, 2016, 4:38:56 AM8/8/16
to rails...@googlegroups.com
Bonjour
Ce n'est pas une application rails avec des indicateurs, c'est une application rails une page en particuliers) qui interroge la base de données à une fréquence déterminée (toutes les 10 minutes par exemple) et qui en fonction du résultat met à jour les contrôles sur la page web
je vais essayer de jetter un coup d'oeil sur rails 5
merci pour tes conseils

Le 8 août 2016 à 10:36, Francis MILHAU <francis...@free.fr> a écrit :
Bonjour
Ce n'est pas une application rails avec des indicateurs, c'est une application web (une page en particuliers) qui interroge la base de données à une fréquence déterminée (toutes les 10 minutes par exemple) et qui en fonction du résultat met à jour les contrôles sur la page web
je vais essayer de jetter un coup d'oeil sur rails 5
merci pour tes conseils



> ---
> Vous recevez ce message, car vous êtes abonné au groupe Google Groupes
> "Railsfrance".
> Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le
> concernant, envoyez un e-mail à l'adresse
> Pour obtenir davantage d'options, consultez la page
> https://groups.google.com/d/optout.

--
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse rails...@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance-unsubscribe@googlegroups.com
---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes Railsfrance.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse railsfrance+unsubscribe@googlegroups.com.
Pour plus d'options, visitez le site https://groups.google.com/d/optout .

--
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse rails...@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse railsfrance-unsubscribe@googlegroups.com
---
Vous recevez ce message, car vous êtes abonné à un sujet dans le groupe Google Groupes "Railsfrance".
Pour vous désabonner de ce sujet, visitez le site https://groups.google.com/d/topic/railsfrance/HtOIj8uJg_E/unsubscribe.
Pour vous désabonner de ce groupe et de tous ses sujets, envoyez un e-mail à l'adresse railsfrance+unsubscribe@googlegroups.com.

Florian Dutey

unread,
Aug 8, 2016, 5:03:20 AM8/8/16
to rails...@googlegroups.com
Je pense que le probleme ici est clairement que tu as une mauvaise conception (no offense) de ce qu'est un serveur web.

Deux choses en particulier

1) Un serveur web est une application qui ecoute un port en particulier et qui repond a des evenement http avec des connections dont la duree de vie est courte.
2) Un serveur web n'a pas pour but d'executer des taches de fond et de push les reponses a ses clients.

Ce n'est pas important que ce ne soit "qu'une seule page". Ce n'est pas le job d'un serveur web. Ca prend un process en continu qui n'est pas disponible pour les autres. Et c'est super inefficace que d'occuper un thread web pour executer des taches qui n'ont rien a voir avec "repondre a une requette http".

Une solution bien meilleure (mais pas forcement parfaite et y'en a probablement d'autres) serait que tu aies un demon qui execute la  tache de fond, puis qui ecrive le resultat quelque part.

Le "quelque part" est important car les choix technologiques seront radicalement differents.

1) tu peux ecrire en db, dans une table de resultats. Tes clients web pull le serveur a intervale regulier, et ton serveur web se contente de choisir le bon data a leur envoyer. Ils peuvent par exemple, envoyer la derniere date a laquelle ils ont pull le serveur et le serveur leur envoie tout ce qui a ete ajoute apres cette date.
2) tu peux ecrire dans une websocket. Chaque fois que ton demon fini une boucle, il envoie une notif via le serveur websocket (qui n'est PAS le serveur web mais un serveur dedie) qui broadcastera a tous les clients connectes.
3) Tu peux mixer 1 et 2. Tu notifies via websocket mais tu enregistres aussi les resultats en db, comme ca quand quelqu'un charge la page, il peut recuperer les infos des X dernieres boucles (et tu as un historique ce qui permet eventuellement par la suite de calculer d'autres stats sur ce data).

Comme demon, tu peux soit te faire un petit script a la con et utiliser une gem pour "demoniser" le dit script. Y'a beaucoup de gems qui permettent de faire ca mais peu sont encore tres active. Tu peux aussi essayer de jouer avec activeJob / Sidekiq ... mais je le deconseille parce que, meme chose que pour le serveur web, si ton appli necessite beaucoup de jobs "spontanes", tu en paralyses un en permanence pour runner une boucle infinie.

My 2 cents

ziburudebian

unread,
Aug 8, 2016, 10:16:14 AM8/8/16
to Railsfrance
merci à tous et en particuliers à florian,
j'ai effectivement peut d’expérience dans les applications web et tes conseils me sont bien utiles
j'ai bien compris et te remercie beaucoup
je vais les mettre en œuvre

Florian Dutey

unread,
Aug 8, 2016, 11:54:37 AM8/8/16
to rails...@googlegroups.com
A ton service ;)

--
Reply all
Reply to author
Forward
0 new messages