Использование данных, полученных с помощью опроса в представлении Rails - PullRequest
0 голосов
/ 09 октября 2019

В попытке понять короткий опрос 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

1 Ответ

0 голосов
/ 09 октября 2019

У вас есть два решения вашей проблемы:

1. Визуализируйте шаблон js.erb с вашего сервера

Файл js.erb содержит код JavaScript, который мы отправим с сервера и выполним на внешнем интерфейсе.

Проще говоря, вместо рендеринга классического HTML, сервер будет отправлять обратно код JavaScript, который вы пишете в своем файле js.erb. Преимущество такого подхода заключается в том, что вы можете использовать ruby ​​в своем шаблоне и визуализировать ваши комментарии в формате html, а не создавать его с нуля. (см. ссылку на документацию по rails ниже для более подробной информации)

В вашем контроллере:

def show
  @comments = Comment.all

  respond_to do |format|
    format.js
    format.html
  end
end

В вашем файле views/comments/show.js.erb (который будет отображаться сервером):

$("#comments").html('<%= j render @comments %>')

На ваш взгляд view/comments/show.html.erb

function reloadComments() {
  $.ajax({
    type: 'GET',
    url: '/comments',
    dataType: 'script'
  })
}

// Trigger after loading the page
$(function() {
  setTimeout(reloadComments, 3000);
});

Более подробная информация в документации по Rails здесь

2. Создайте шаблон HTML на основе данных json в своем внешнем javascript

Я не буду размещать здесь код, но в Интернете достаточно ресурсов, и это не самый простой подход к вашей проблеме.

...