为网站的所有用户加载destroy.js.erb

时间:2018-04-11 08:40:29

标签: javascript ajax ruby-on-rails-5

我正在尝试为网站的每个用户触发destroy.js.erb操作,以便在不需要刷新的情况下立即删除每个用户屏幕上删除的注释。

comments_controller.rb

def destroy
 @comment = Comment.find(params[:id])

 respond_to do |format|
  format.js {}
 end

 @comment.destroy
end

destroy.js.erb

$('[data-id="<%= @comment.id %>"]').remove();

我完全可以使用此脚本立即向网站添加新评论,但我无法弄清楚如何为已删除的元素实现相同的效果。

index.html.erb

<script>
$(function() {
  setTimeout(updateComments, 10000);
});

function updateComments () {
  var after = $(".comment:first-child").attr("data-time");
  $.getScript("/comments.js?after=" + after)
  setTimeout(updateComments, 10000);
}
</script>

index.js.erb的

$("#comments").prepend("<%= raw escape_javascript(render :partial => 'comments') %>")

1 个答案:

答案 0 :(得分:0)

听起来就像你在追踪Rails 5.0中发布的Action Cable

它通过Web套接字使用Pub/Sub模式向任何侦听客户端发送更新。这听起来似乎可以很好地解决您的问题。

有关Action Cable的一些rails文档,请参阅here

根据您对编码的新程度,这可能有点难以理解。请随意查看一些好的教程herehere或google以获取更多信息。

如果您想使用普通的javascript维护当前的方法。您可以让每个客户端定期向comments#index路由发送请求,返回html,然后用返回的新html替换注释块。这比您当前的解决方案简单,但在服务器端更昂贵。