Я хочу загрузить, а затем обработать файл в приложении 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 вернет текущий прогресс в виде целого числа (% complete), и это будет передано в код JavaScript setProgress (который обновит экранный элемент).
Однако я изо всех сил пытаюсь получить правильный ответ от сервера, который затем можно передать в JavaScript.
Может ли кто-нибудь помочь, или я неправильно подхожу к этому?
Есть еще один вопрос, я изначально обновлял этот вопрос, но обновление было достаточно другим, чтобы вызвать новый вопрос, здесь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


periodically_call_remote() обновляет div. Он не будет вызывать вашу функцию JavaScript. Я не гуру JavaScript, но чтобы решить вашу проблему, вы должны сделать свой собственный вызов xmlhttp. На вашем месте я бы использовал запрос прототипа AJAX
http://www.prototypejs.org/api/ajax/request
и используйте JavaScript settimeout или setinterval для периодического опроса
http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/
надеюсь, это поможет, потому что на самом деле я тоже сталкивался с тем же prb =)
Параметр :update должен содержать только список div, который вы хотите обновить, НЕ иметь Javascript, который вы хотите оценить.
Помощники Rails по-прежнему очень хороши для этой ситуации, нет необходимости писать много пользовательских JS. Если вы хотите выполнить JS по возвращении, простым способом будет визуализация шаблона RJS. Если вы хотите сделать это с помощью чистого HTML, просто визуализируйте представление (или частично, или вернитесь непосредственно из метода render с HTML-кодом индикатора выполнения) и поместите div индикатора выполнения в параметр :update метода periodically_call_remote.