Обновление прогресса на стороне сервера в приложении Rails
-
02-07-2019 - |
Вопрос
Я хочу загрузить, а затем обработать файл в приложении Ruby on Rails.Загрузка файла обычно занимает довольно мало времени, но обработка на стороне сервера может занять некоторое время (более 20 секунд), поэтому я хочу дать пользователю некоторый индикатор - что-то лучше, чем бессмысленный экран «обработка...».
Я пытаюсь использовать следующий код в представлении
<%= periodically_call_remote(:url => {:action => 'progress_monitor', :controller => 'files'},
:frequency => '5',
:update => "setProgress('progressBar','5')"
) %>
Содержимое параметра :update — это javascript, который я хочу запускать каждые 5 секунд.
и следующий код находится в контроллере файлов
def progress_monitor
render :text => 'whatever'
end
В конце концов метод Progress_monitor вернет текущий прогресс в виде целого числа (% завершения), которое будет передано в код JavaScript setProgress (который обновит элемент на экране).
Однако я изо всех сил пытаюсь получить правильный ответ от сервера, который затем можно будет передать в JavaScript.
Может ли кто-нибудь помочь, или я подхожу к этому неправильно?
К этому вопросу есть дополнительный вопрос. Первоначально я обновил этот вопрос, но обновление было достаточно другим, чтобы гарантировать новый вопрос. здесь.
Решение
periodically_call_remote()
обновляет div
.Он не будет вызывать вашу функцию JavaScript.Я не гуру JavaScript, но чтобы решить вашу проблему, вам следует сделать свою собственную xmlhttp
вызов.На вашем месте я бы использовал AJAX-запрос прототипа.
http://www.prototypejs.org/api/ajax/request
и используйте settimeout или setinterval JavaScript для периодического опроса
http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/
надеюсь, это поможет, потому что на самом деле я тоже столкнулся с той же проблемой =)
Другие советы
А :update
В этом параметре должен быть указан только элемент div, который вы хотите обновить, а не Javascript, который вы хотите оценить.
Помощники Rails по-прежнему очень хороши для этой ситуации, нет необходимости писать много специального JS.Если вы хотите выполнить JS по возвращении, простым способом будет отрисовка шаблона RJS.Если вы хотите сделать это с помощью чистого HTML, просто визуализируйте представление (или частичное, или вернитесь непосредственно из render
с HTML-кодом индикатора выполнения) и поместите div индикатора выполнения в :update
вариант periodically_call_remote
метод.