2008-09-23 7 views
4

Je souhaite télécharger puis traiter un fichier dans une application Ruby on Rails. Le téléchargement du fichier est généralement assez court, mais le traitement côté serveur peut prendre un certain temps (plus de 20 secondes), donc je veux donner à l'utilisateur un indicateur - quelque chose de mieux qu'un écran 'traitement ...' sans signification.Mise à jour de la progression côté serveur sur l'application Rails

J'essaie d'utiliser le code suivant dans la vue

<%= periodically_call_remote(:url => {:action => 'progress_monitor', :controller => 'files'}, 
       :frequency => '5', 
       :update => "setProgress('progressBar','5')" 
       ) %> 

Le contenu du: paramètre de mise à jour est le javascript que je veux courir toutes les 5 secondes

et le code suivant est en le contrôleur de fichiers

def progress_monitor 
    render :text => 'whatever' 
end 

Finalement, le procédé de progress_monitor retourne l'état d'avancement sous forme d'entier (% effectués) et qui est passé dans le « setProgress » code javascript (qui mettra à jour un élément à l'écran)

Cependant, je n'arrive pas à obtenir une réponse correcte du serveur qui peut ensuite être passée en javascript.

Est-ce que quelqu'un peut aider, ou est-ce que je m'approche de ce mauvais chemin?

Il y a une question de suivi à ceci, j'ai initialement mis à jour cette question mais la mise à jour était suffisamment différente pour justifier une nouvelle question, here.

Répondre

2

periodically_call_remote() met à jour une div. Il n'appellera pas votre fonction javascript. Je ne suis pas un gourou javascript, mais pour résoudre votre problème, vous devriez faire votre propre appel xmlhttp. Si je devais vous, j'utiliser la demande ajax de prototype

http://www.prototypejs.org/api/ajax/request

et utiliser le javascript de la settimeout ou setInterval pour faire le sondage périodique

http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/

espérons que cette aide cos en fait je l'ai rencontré le même prb aussi =)

0

L'option :update devrait seulement lister la div que vous voulez mettre à jour, PAS Javascript que vous voulez évaluer.

Les assistants Rails sont encore très bons pour cette situation, il n'y a pas besoin d'écrire beaucoup de JS personnalisés. Si vous souhaitez exécuter JS au retour, un moyen simple serait de rendre un modèle RJS. Si vous souhaitez le faire en HTML pur, affichez simplement une vue (ou partiel, ou retournez directement à partir de la méthode render avec le code HTML de la barre de progression) et placez la div de la barre de progression dans l'option periodically_call_remote.

Questions connexes