У меня проблема с ActionCable и Turbolinks. Я установил приложение для чата, похожее на пример приложения для чата, которым поделился DHH.
Чтобы иметь несколько комнат чата и передать идентификатор комнаты чата инициализатору подписки 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(){...
Но тогда я не могу получить идентификатор комнаты чата (pod_slug), потому что документ DOM не загружается до выполнения javascript.
Похоже, у этой проблемы есть простое решение, поскольку Basecamp активно поддерживает и ActionCable, и Turbolinks. Многие из демонстрационных руководств по чату предлагаю настроить чат именно таким образом. Я что-то упустил здесь?