Actualización del servidor-lado de los progresos en la aplicación Rails
-
02-07-2019 - |
Pregunta
Quiero cargar y, a continuación, el proceso de un archivo en un Ruby on Rails app.El archivo de carga es generalmente muy corto, pero del lado del servidor, el proceso puede tardar algún tiempo (más de 20 segundos), así que quiero dar al usuario un indicador - algo mejor que un sin sentido "procesando..." en la pantalla.
Estoy tratando de utilizar el siguiente código en la vista
<%= periodically_call_remote(:url => {:action => 'progress_monitor', :controller => 'files'},
:frequency => '5',
:update => "setProgress('progressBar','5')"
) %>
El contenido de el :actualización parámetro es el javascript que quiero que se ejecute cada 5 segundos
y el siguiente código en los archivos de controlador de
def progress_monitor
render :text => 'whatever'
end
Finalmente, el progress_monitor método devolverá el progreso actual como un entero (% completa) y que será transmitido en el 'setProgress' código JavaScript (que va a actualizar un elemento de la pantalla)
Sin embargo, yo estoy luchando para conseguir una correcta respuesta desde el servidor que puede pasar en JavaScript.
Alguien puede ayudar o me estoy acercando el camino equivocado?
Hay una pregunta de seguimiento a esto, me actualizada originalmente esta pregunta, pero la actualización era lo suficientemente diferentes como para justificar una nueva pregunta, aquí.
Solución
periodically_call_remote()
las actualizaciones de un div
.No llame a su función de JavaScript.Yo no soy de JavaScript gurú, sino para resolver su problema, usted debe hacer su propia xmlhttp
de la llamada.Si yo fuera usted, me gustaría utilizar el prototipo de la petición AJAX
http://www.prototypejs.org/api/ajax/request
y el uso de JavaScript settimeout o setinterval para hacer el periódico de votación
http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/
espero que esto ayude cos en realidad me he encontrado con el mismo prb demasiado =)
Otros consejos
El :update
opción sólo una lista de los div que quieres actualizar, NO tiene Javascript que se desea evaluar.
Los Rieles ayudantes son muy buenos para esta situación, no hay necesidad de escribir mucho personalizado JS.Si desea ejecutar JS en la devolución, una manera fácil sería dar una RJS plantilla.Si quieres hacerlo con HTML puro, simplemente representar un punto de vista (o parcial, o la devolución directamente desde el render
método con el HTML de la barra de progreso) y poner el div de la barra de progreso en la :update
la opción de la periodically_call_remote
método.