2010-07-13 3 views
0

Je div balise nommée update_info dans la vue my_view.html.erb et mise à jour d'action prend plusieurs minutes pour terminer dans le contrôleur my_controller.rb.Mise à jour une partie de vue (div) en cours de l'action du contrôleur dans Rails

Je souhaite mettre à jour update_info balise div toutes les secondes que mise à jour les progrès de l'action.

Comment est-ce que je peux faire ceci? Est-ce une vue de mise à jour possible de la boucle de l'action?

Ou en utilisant Ajax ?, si oui, comment puis-je accéder aux données côté serveur et où les données sont-elles stockées? (Je ne sais pas beaucoup sur Ajax, s'il vous plaît expliquer à l'aide Ajax méthodes d'aide Rails si nécessaire)

Dis-moi des détails plz. Merci.

Répondre

0

Vous pouvez utiliser des partiels pour mettre à jour certains div. Vous pouvez appeler le contrôleur via ajax. , puis restituez votre sortie à l'aide d'une partie.

render :partial => "partial_name", :layout => false, :locals => {:local_var => xyz} 

Note: début de nom partiel avec '_'

+0

non seulement mettre à jour div, mettre à jour plusieurs fois au cours de l'action. –

0

Un commentaire d'abord: vous devriez éviter d'avoir plusieurs demandes minutes (vous devez utiliser le traitement de fond). Maintenant, en fonction de ce que vous faites réellement dans cette requête, la méthode standard consiste à interroger le serveur (via une requête répétitive ajax, autre que la requête en cours) sur la progression de la tâche en cours. Vous pouvez le faire en utilisant la fonction periodically_call_remote.

Pour avoir une idée:

À votre avis:

<%= periodically_call_remote(
    :condition => "check_var == false", 
    :frequency => 3, 
    :url => { :action => "evaluate_progress" }) %> 

Dans votre contrôleur:

def evaluate_progress 
    # replace it with code that actually computes the progress 
    done = 0.6 
    render :update do |page| 
    if(done == 1) 
     page << "check_var = false" #To stop querying the server 
    else 
     page << "check_var = true" 
     page.replace_html('your_div_id', "The task is #{done*100}% complete.") 
    end 
    end 
end 

Encore une fois, cela est juste une preuve de concept, je ne l'ai pas testé il. Le code réel dépend également de ce que vous faites réellement dans la demande de longue durée.

Questions connexes