Уведомления Action Cable для нескольких подписок

Я пытаюсь получить небольшой красный круг уведомлений для динамического обновления в моем приложении чата Rails с помощью Action Cable. Проблема в том, что иногда, когда сообщение отправлено, кажется, что оно запускает функцию получения более одного раза. Я почти уверен, что подписки определены правильно, но что-то идет не так.

Здесь я обязательно создаю подписки, используя параметр chat_id. Этот же параметр используется в функции submitNewMessage.

активы/javascript/каналы/chat.js

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

submitNewMessage();

$.ajax({
 type: "GET",
 dataType: "json",
 url: "/chats",
 success: function(data){
    $.each(data, function(i, chat){
        App['chat' + chat.id] = App.cable.subscriptions.create({
            channel: "ChatChannel",
            chat_id: chat.id}, 
            { received: function(data){

            # Code to update notifications
            }}
        });
     }
   }
});

function submitNewMessage(){
      $('#message_text').keydown(function(event) {
            if (event.keyCode == 13) {
                var text = event.target.value
                App['chat' + chat_id].send({text: text})
                $('#message_text').val(" ")
                return false;
            }
        });
}
});

И в методе с подпиской я также использую параметры chat_id

каналы/chat_channel.rb

class ChatChannel < ApplicationCable::Channel

  def subscribed
      stream_from "chat_#{param['chat_id']}_channel"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end

  def receive(payload)
      Message.create(user_id: current_user.id, chat_id: params["chat_id"], text: payload["text"])
  end    

end

Как может полученная функция в chat.js запускаться более одного раза при запуске нового комментария?


person Michael Parton    schedule 14.10.2016    source источник


Ответы (1)


Оказывается, запрос Ajax создавал дубль каждого запроса, когда я посещал другие страницы. Я исправил это, добавив

if (App['chat' + chat.id] == undefined){...

перед созданием подписок. Таким образом, подписка создается только в том случае, если она еще не существует.

person Michael Parton    schedule 15.10.2016