Как запустить и остановить инициируемые JavaScript запросы в моем приложении Rails? - PullRequest
3 голосов
/ 30 августа 2011

У меня есть приложение, которое должно периодически обновлять область «новостей» на экране, пока у моего объекта Publisher есть новости. Когда новостей нет, эта область экрана скрыта (или просто не отображается), и обновление останавливается. В качестве отправной точки я использовал превосходный Опрос для изменений RailsCast Райана Бейтса, но я застрял на нескольких моментах.

Я предполагаю, что если у объекта Publisher есть новости, его метод show () отображает страницу с <div id='news'></div>. Javascript заметит этот div и заменит его (и его содержимое) любыми новостями, которые есть у Издателя, и выполнит повторную попытку через 5 секунд. Когда у издателя больше нет новостей, Javascript заменит <div id='news'></div> пустой строкой. При следующем запуске не будет больше <div id='news'></div>, поэтому процесс повторного запуска остановится. По крайней мере, это намерение.

Во-первых, проблемы:

  1. Хотя я знаю, что моя часть вызывается, она не вызывает видимых изменений на экране
  2. (Возможно, относится к 1.) Javascript fn продолжает вызываться, даже если больше нет новостей для показа.

Вкратце, вот основные части:

файл: public / javascripts / application.js

$(function () {  
  if ($('#news').length > 0) {  
    setTimeout(updateNews, 5000);
  }
});  

function updateNews() {  
    $.getScript('/publisher/update_news.js');  
    setTimeout(updateNews, 5000);
}

файл: config / rout.rb

resource :publisher, :only => [:show] do
  member {
    get :update_news
  }
end

файл: app / controllers / publishers_controller.rb

def show
end

def update_news
  @publisher = find_publisher
  unless (@publisher.has_news?)
    return head :ok
  end
  # otherwise should render views/publisher/update_news.js.html
end

файл: app / views / publisher / show.html.erb

<%= render :partial => 'publishers/show_news', 
           :locals => {:publisher => @publisher} %>

файл: app / views / publisher / update_news.js.erb

<% t = escape_javascript(raw(render(:partial => 'publishers/show_news', 
                                    :locals => {:publisher => @publisher}))) %>
$('#news').replace_with(' + <%= t %> + ');

файл: app / views / publisher / _show_news.html.erb

<div id='news'>
  <h4>latest news</h4>
  <%= simple_format publisher.news %>
</div>

В сообщениях Rails.logger.debug сообщается, что вызывается частичное _show_news.html.erb как через метод show (), так и через метод updateNews (), инициированный javascript. Но я не вижу изменений на экране и (возможно, связанных) функция updateNews продолжает вызываться после Publisher.has_news? возвращает ложь (Последняя проблема будет объяснена, если функция jQuery replace_with () всегда начинается с первоначально отображаемой страницы, а не с результатов ее собственных модификаций.)

Итак, два вопроса: 1. Почему я не вижу видимых изменений на экране? Я неправильно использую замену jQUery? 2. Я с подозрением отношусь к моей технике остановки обновлений. Какой правильный путь?

1 Ответ

1 голос
/ 30 августа 2011

Чтобы помочь с отладкой:

Используйте fiddler (windows) или Mac tool , чтобы точно узнать, что передается между html / jScript-страницей в вашем браузере и сервером.

Вы пытались использовать отладчик браузера, чтобы понять, что происходит?

Полагаю, что файлы js, отправляемые с вашей страницы .js.erb, работают неправильно.

...