Rails ActionCable/Turbolinks聊天问题:发布重复消息

问题描述:

我遇到ActionCable和Turbolinks的问题。我已经创建了一个类似于example chat app shared by DHH的聊天应用程序。Rails ActionCable/Turbolinks聊天问题:发布重复消息

为了有多个聊天室,并通过聊天室ID的ActionCable订阅初始化,我有这样的事情:

$(document).on("turbolinks:load",function(){ 
    var pod_slug = $("#pod_slug_value").val(); 
    App.pods = App.cable.subscriptions.create(
    { channel: 'PodsChannel', pod_slug: pod_slug }, 
    { 
    received: function(data) { 
     if ($(".chat-stream").length){ 
     $(data.message).appendTo($(".chat-stream")); 
     $(".chat-stream").scrollTop($(".chat-stream")[0].scrollHeight); 
     } 
    }, 

    speak: function(message, pod_slug) { 
     return this.perform('speak',{ 
     message: message, 
     pod_slug: pod_slug 
     }); 
    } 
    }); 

    // captures text input from input field 
    captureMessage(); 

}); 

然而,当我点击周围的应用程序,并回到页面,Turbolinks似乎多次绑定订阅处理程序,现在当我提交消息时,聊天流中会出现重复消息。

我试过在每一个方式切片这个问题。我没有问题,当我不前言与订阅处理程序:

$(document).on("turbolinks:load",function(){... 

但后来,我无法获得聊天室ID(pod_slug),因为该文档DOM之前没有负载JavaScript执行。

看起来这个问题会有一个简单的解决方案,因为ActionCable和Turbolink都受到Basecamp的大力支持。许多demo chat tutorials建议以这种方式设置聊天。我在这里错过了什么吗?

您可以使用App.cable.subscriptions.remove删除由App.cable.subscriptions.create返回的订阅。因此,可能检查是否设置了App.pods,如果是这样,请在再次订阅之前将其删除。

我有同样的问题,并以这种方式

if (!App.pods) { 
    App.pods = App.cable.subscriptions.create(
    { channel: 'PodsChannel', pod_slug: pod_slug }, 
    { ... /* and so on */ } 
} 

重新加载页面,每次修好了“turbolinks:加载”事件的作品,所以你必须检查App.pods对象是否已被创建。

希望这会帮助你。

+0

但不app.pods包含所有不同聊天室的参考?因此,检查它是否存在会阻止您在创建一个房间后启动新房间。没有? – Lorenz

+0

@洛伦兹是的,你是对的。就我而言,我只需要一个通道,所以这个解决方案对我来说很合适。但是现在我对这个问题很感兴趣,所以我会试着找出我可以如何帮助你。 – MaruniakS

+0

我做了类似的事情来暂时解决我的问题: 'if(!App.pods || JSON.parse(App.pods.identifier).pod_slug!= pod_slug){' '但它感觉非常黑客。 – Lorenz

我喜欢你的方法,MaruniakS。挖掘消费者对象,看起来它有一个测试,看看它是否断开连接。改变只是第一线,我们也可以这样做:

if (!App.pods || App.pods.consumer.connection.disconnected) { 
    App.pods = App.cable.subscriptions.create(
    { channel: 'PodsChannel', pod_slug: pod_slug }, 
    { ... /* and so on */ } 
}