У меня есть приложение, которое должно периодически обновлять область «новостей» на экране, пока у моего объекта Publisher есть новости. Когда новостей нет, эта область экрана скрыта (или просто не отображается), и обновление останавливается. В качестве отправной точки я использовал превосходный Опрос для изменений RailsCast Райана Бейтса, но я застрял на нескольких моментах.
Я предполагаю, что если у объекта Publisher есть новости, его метод show () отображает страницу с <div id='news'></div>
. Javascript заметит этот div и заменит его (и его содержимое) любыми новостями, которые есть у Издателя, и выполнит повторную попытку через 5 секунд. Когда у издателя больше нет новостей, Javascript заменит <div id='news'></div>
пустой строкой. При следующем запуске не будет больше <div id='news'></div>
, поэтому процесс повторного запуска остановится. По крайней мере, это намерение.
Во-первых, проблемы:
- Хотя я знаю, что моя часть вызывается, она не вызывает видимых изменений на экране
- (Возможно, относится к 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. Я с подозрением отношусь к моей технике остановки обновлений. Какой правильный путь?