Jquery 在Rails视图中使用通过轮询检索的数据

Jquery 在Rails视图中使用通过轮询检索的数据,jquery,html,ruby-on-rails,polling,Jquery,Html,Ruby On Rails,Polling,为了理解Javascript短轮询,我尝试创建一个包含注释列表的简单页面。Rails视图将轮询服务器以获取任何更新(新注释),并相应地不断更新页面 到目前为止,我已经设法使用setTimeout每3秒向服务器发送一次请求(我可以看到这一点,因为我每3秒收到一次警报) 但是我如何将这些信息反馈给视图,或者更具体地说,如何用我在响应中得到的新注释列表替换呈现的@comments 评论清单 函数重载注释(){ $.get('/',函数(数据,状态){ 警报(“数据:+Data.comments+”\

为了理解Javascript短轮询,我尝试创建一个包含注释列表的简单页面。Rails视图将轮询服务器以获取任何更新(新注释),并相应地不断更新页面

到目前为止,我已经设法使用
setTimeout
每3秒向服务器发送一次请求(我可以看到这一点,因为我每3秒收到一次警报)

但是我如何将这些信息反馈给视图,或者更具体地说,如何用我在响应中得到的新注释列表替换呈现的
@comments


评论清单
函数重载注释(){
$.get('/',函数(数据,状态){
警报(“数据:+Data.comments+”\n状态:+status);
});
setTimeout(重载注释,3000);
}
//加载页面后触发
$(函数(){
setTimeout(重载注释,3000);
});

通过HTTP GET调用调用的控制器方法将所有注释作为JSON返回,如下所示:

def显示
@comments=Comment.all
回应待办事项|格式|
format.json{render json:{comments:@comments}}
format.html
结束
结束
我认为我的问题与此类似,但从未得到令人满意的回答:

另外,我知道轮询可能不是近实时更新的最佳解决方案(我知道WebSocket)。由于此应用程序仅用于POC,因此我不担心向服务器发出太多请求

谢谢大家!

Ruby版本:2.6.3
Rails版本:6.0.0

您有两种解决方案:

1。从服务器呈现
js.erb
模板

一个
js.erb
文件包含我们将从服务器发送并在前端执行的javascript代码

简单地说,服务器将返回您在
js.erb
文件中编写的javascript代码,而不是呈现经典HTML。这种方法的优点是可以在模板中使用ruby,并将注释呈现为html,而不是从头开始构建。(有关更多详细信息,请参阅下面的rails文档链接)

在控制器中:

def显示
@comments=Comment.all
回应待办事项|格式|
format.js
format.html
结束
结束
视图/comments/show.js.erb
文件中(将由服务器呈现):

2。从前端javascript中的json数据构建HTML模板


我不会把代码放在这里,但网上有很多资源,这不是解决您问题的最简单方法。

谢谢您的回复,但很抱歉,我对Ajax/erb等不熟悉,不太了解您的答案。但我逐渐意识到,试图通过Ajax更新@comments变量可能不是最明智的方法,我正在尝试另一种解决方案。嘿,Risa,我在回答中添加了更多细节。基本上,您向rails服务器发出datascript请求,该请求将根据rails约定呈现matchin js.erb文件。一旦请求结束,您在该文件中写入的内容(这里我们只是呈现@comments并在视图中替换它)将在前端执行。
$("#comments").html('<%= j render @comments %>')
function reloadComments() {
  $.ajax({
    type: 'GET',
    url: '/comments',
    dataType: 'script'
  })
}

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