как получить несколько исполнений js.erb (rails + ajax + jquery) - PullRequest
1 голос
/ 13 июня 2011

Я работаю в небольшом онлайн-менеджере состояния для некоторых поддоменов, которые у меня есть в моем проекте.

Проблема в том, что проверка состояния каждого субдомена в сети немного медленная, поэтому ярешил сначала отобразить только таблицу с именем субдомена, а затем проверить онлайн-статус с помощью AJAX, показывая онлайн / автономное изображение.

Я реализовал работающую проверку состояния AJAX, но проблема в том,до тех пор, пока ВСЕ субдомены не будут проверены, результат не будет отображаться на сайте, так что это не является значительным улучшением, потому что пользователь должен долго ждать, не зная, все ли работает нормально.проверка статуса поддоменов обновляется по одному, не дожидаясь завершения всех проверок.

Моя идея состоит в том, чтобы использовать что-то вроде этого:

/app/controllers/status_controller.rb
@institutes = Institute.all

  respond_to do |format|

    @institutes.each do |inst|
      format.js { render :locals => { :institute => inst } }
    end

И

/app/view/status/status.js.erb
<% # Iterates through institutes and checks their online availability %>
$('.instance_name[value="<%= institute.cms_instance_name %>"]')
  .next('.cm_online')
  .html("<%= institute.cm_online? %>");

Теперь он обновляет только первый элемент в массиве и останавливает рендеринг большего числа итераций.Есть ли другой способ сделать это?

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 июня 2011

ОК, я решил это.Проблема заключалась в моем подходе, потому что, как только страница отображается, она не будет отображаться снова, поэтому цикл в контроллере не работал.

Итак, я просто создал цикл в application.js,поэтому каждый раз, когда пользователь нажимает ссылку обновления, он запускает вызов AJAX для каждого элемента в списке поддоменов:

function institute_call_ajax() {
    $('.instance_name').each(function() {
        $.ajax({
            type: "GET",
            url: "/status/status",
            data: 'instance_name=' + $(this).val()
        });
    });
}

Затем я фиксирую идентификационное имя института (поддомен) и отправляю его наФайл .js.erb, поэтому он обновляет представление.

def status
    @institutes = Institute.find_all_by_live(true)
    institute = Institute.find_by_cms_instance_name(params[:instance_name])

    respond_to do |format|
      format.js { render :locals => { :institute => institute } }

      format.html # status.html.erb
      format.xml  { render :xml => @institutes }
    end
end

Voilà!

0 голосов
/ 13 июня 2011

Не знаю, но вы пробовали это?

/app/controllers/status_controller.rb
@institutes = Institute.all
  respond_to do |format|
       format.js { render :locals => { :institutes => @institutes} }
  end

А

/app/view/status/status.js.erb
<% institutes.each do |institute| %>
       $('.instance_name[value="<%= institute.cms_instance_name %>"]')
  .next('.cm_online')
  .html("<%= institute.cm_online? %>");
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...