В попытке понять короткий опрос Javascript, я пытаюсь создать простую страницу со списком комментариев. Представление Rails будет опрашивать сервер на наличие обновлений (новых комментариев) и соответствующим образом обновлять страницу.
До сих пор мне удавалось использовать setTimeout
для получения запросов, отправляемых на сервер каждые 3 секунды (чтоЯ вижу, потому что я получаю предупреждение каждые 3 секунды).
Но как мне передать эту информацию обратно в представление, или, более конкретно, как заменить @comments
, которые отображаются с новым спискомкомментариев, которые я получил в ответе?
<!-- index.html.erb -->
<h1>List of comments</h1>
<div id="comments">
<%= render @comments %>
</div>
<script>
function reloadComments() {
$.get('/', function(data, status) {
alert("Data: " + data.comments + "\nStatus: " + status);
});
setTimeout(reloadComments, 3000);
}
// Trigger after loading the page
$(function() {
setTimeout(reloadComments, 3000);
});
</script>
<!--_comment.html.erb-->
<div class="comment">
<p><%= comment.content %></p>
</div>
Метод контроллера, который вызывается с помощью вызова HTTP GET, возвращает все комментарии в формате JSON, например:
def show
@comments = Comment.all
respond_to do |format|
format.json { render json: { comments: @comments } }
format.html
end
end
Я думаю, что мой вопрос похож на этот, но на него никогда не было удовлетворительного ответа: Реализация опроса для Rails Frontend для вызова update
Кроме того, я знаю, что опрос не может бытьлучшее решение для обновления почти в реальном времени (я знаю о веб-сокетах). Поскольку это приложение предназначено только для POC, я не беспокоюсь о том, чтобы слишком много запросов к серверу.
Спасибо!
Версия Ruby: 2.6.3 Версия Rails: 6.0.0