Обновление прогресса на стороне сервера в приложении Rails - PullRequest
4 голосов
/ 23 сентября 2008

Я хочу загрузить, а затем обработать файл в приложении 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.

Может кто-нибудь помочь, или я подхожу к этому неправильно?

Существует дополнительный вопрос к этому, я первоначально обновил этот вопрос, но обновление было достаточно другим, чтобы оправдать новый вопрос, здесь .

Ответы [ 2 ]

2 голосов
/ 23 сентября 2008

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/

надеюсь, это поможет, потому что на самом деле я тоже столкнулся с тем же prb =)

0 голосов
/ 23 сентября 2008

Опция :update должна содержать только список div, который вы хотите обновить, а НЕ иметь Javascript, который вы хотите оценить.

Помощники Rails все еще очень хороши в этой ситуации, нет необходимости писать много пользовательских JS. Если вы хотите выполнить JS по возвращении, простой способ - это отобразить шаблон RJS. Если вы хотите сделать это с чистым HTML, просто визуализируйте представление (или частичное, или вернитесь непосредственно из метода render с HTML-индикатором индикатора выполнения) и поместите div индикатора выполнения в параметр :update метод periodically_call_remote.

...