ActionCableとTurbolinksに問題があります。 example chat app shared by DHHに似たチャットアプリを設定しました。しかしRails ActionCable/Turbolinksチャットの問題:重複したメッセージの投稿
$(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();
});
、私はページに戻ってアプリの周りをクリックして来る:複数のチャットルームがあり、ActionCableサブスクリプションの初期化にチャットルームのIDを渡すために
は、私はこのような何かを持っていますTurbolinksはサブスクリプションハンドラを複数回バインドしているようですが、メッセージを送信すると、チャットストリームに重複したメッセージが表示されます。
私はあらゆる方法でこの問題をスライスしてみました。私は、サブスクリプション・ハンドラを前書きしていないとき、私は問題を持っていない:
$(document).on("turbolinks:load",function(){...
しかし、ドキュメントのDOMが前にロードされませんので、私は、チャットルームID(pod_slug)を取得することができませんjavascriptが実行されます。
ActionCableとTurbolinksの両方がBasecampによって大きくサポートされているため、この問題のような単純な解決策があるようです。 demo chat tutorialsの多くは、この方法でチャットを設定することを推奨しています。私はここに何かを逃していますか
ただし、app.podにはすべての異なるチャットルームへの参照は含まれていませんか?だから、それが存在するかどうかをチェックすると、1つの部屋が作成されたら新しい部屋を開始できなくなります。いいえ? – Lorenz
@Lorenzはい、そうです。私の場合は、チャンネルが1つだけ必要なので、このソリューションは私のために働いた。しかし、今私はこの質問に興味があるので、私はどのようにあなたを助けることができるかを調べるつもりです。 – MaruniakS
私はこの問題を一時的に解決するためにこれに似たことをしました: 'if(!App.pods || JSON.parse(App.pods.identifier).pod_slug!= pod_slug){' – Lorenz