Domanda

Voglio caricare e quindi elaborare un file in un'app Ruby on Rails. Il caricamento del file è in genere piuttosto breve, ma l'elaborazione sul lato server può richiedere del tempo (più di 20 secondi), quindi voglio dare all'utente un indicatore - qualcosa di meglio di una schermata 'elaborazione ...' insignificante.

Sto cercando di usare il seguente codice nella vista

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

Il contenuto del parametro: update è il javascript che voglio eseguire ogni 5 secondi

e il seguente codice si trova nel controller dei file

def progress_monitor
  render :text => 'whatever'
end

Alla fine il metodo progress_monitor restituirà l'avanzamento corrente come numero intero (% completo) e che verrà passato al codice JavaScript 'setProgress' (che aggiornerà un elemento sullo schermo)

Tuttavia, faccio fatica a ottenere una risposta corretta dal server che può quindi essere passata in JavaScript.

Qualcuno può aiutare, o mi sto avvicinando a questo nel modo sbagliato?

C'è una domanda di follow-up a questo, ho originariamente aggiornato questa domanda ma l'aggiornamento era sufficientemente diverso da giustificare una nuova domanda, qui .

È stato utile?

Soluzione

periodically_call_remote () aggiorna un div . Non chiamerà la tua funzione JavaScript. Non sono un guru JavaScript, ma per risolvere il tuo problema, dovresti fare la tua chiamata xmlhttp . Se fossi in te, utilizzerei la richiesta AJAX del prototipo

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

e utilizza il settimeout o setinterval di JavaScript per eseguire il polling periodico

http://www.elated.com/ articoli / javascript-time-con-setTimeout-e-setInterval /

spero che questo aiuti perché in realtà ho incontrato anche lo stesso prb =)

Altri suggerimenti

L'opzione : update dovrebbe elencare solo i div che si desidera aggiornare, NON avere Javascript che si desidera valutare.

Gli helper di Rails sono ancora ottimi per questa situazione, non è necessario scrivere molti JS personalizzati. Se si desidera eseguire JS al ritorno, un modo semplice sarebbe quello di rendere un modello RJS. Se desideri farlo con HTML puro, esegui semplicemente il rendering di una vista (o parziale, oppure ritorna direttamente dal metodo render con l'HTML della barra di avanzamento) e inserisci il div della barra di avanzamento nella : aggiorna l'opzione del metodo periodically_call_remote .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top