【发布时间】:2020-02-06 08:37:00
【问题描述】:
为了理解 Javascript 短轮询,我正在尝试创建一个包含 cmets 列表的简单页面。 Rails 视图将轮询服务器以获取任何更新(新 cmets),并相应地更新页面。
到目前为止,我已经设法使用setTimeout 每 3 秒将请求发送到服务器(我可以看到,因为我每 3 秒收到一个警报)。
但是我如何将此信息反馈给视图,或者更具体地说,如何将呈现的 @comments 替换为我在响应中返回的新 cmets 列表?
<!-- 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 调用调用的控制器方法将所有 cmets 作为 JSON 返回,如下所示:
def show
@comments = Comment.all
respond_to do |format|
format.json { render json: { comments: @comments } }
format.html
end
end
我想我的问题和这个类似,但从来没有得到满意的回答:Implementing polling for Rails Frontend to call update
另外,我知道轮询可能不是近乎实时更新的最佳解决方案(我知道 websockets)。由于此应用仅用于 POC,因此我不担心向服务器发出过多请求。
谢谢!
Ruby 版本:2.6.3 Rails 版本:6.0.0
【问题讨论】:
标签: jquery html ruby-on-rails polling