Обновление прогресса на стороне сервера в приложении Rails

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

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
0
1 828
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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.

Другие вопросы по теме