多个订阅的 Action Cable 通知

Posted

技术标签:

【中文标题】多个订阅的 Action Cable 通知【英文标题】:Action Cable notifications for multiple subscriptions 【发布时间】:2017-02-24 08:39:18 【问题描述】:

我正在尝试使用 Action Cable 在我的 Rails 聊天应用程序中动态更新一个红色通知圈。问题是有时在发送消息时,似乎不止一次触发接收函数。我很确定我的订阅定义正确,但是出了点问题。

在这里,我确保使用 chat_id 参数创建订阅。在 submitNewMessage 函数中使用相同的参数

assets/javascript/channels/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中的received函数怎么会被触发多次?

【问题讨论】:

【参考方案1】:

事实证明,当我访问其他页面时,Ajax 请求正在为每个请求创建双倍。我通过添加来修复它

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

在创建订阅之前。这样,它只会在订阅不存在时创建订阅。

【讨论】:

以上是关于多个订阅的 Action Cable 通知的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 5 Action Cable:当前模型实例的流(基于 URL 的订阅)

Ruby on Rails:如何通过 ngrok 访问 Action Cable?

如何使用 App.cable.subscriptions.remove 在 Rails 5 中删除可操作的频道订阅?

由 config.action_cable.url 定义的 URL 在被 Vue 前端使用时生成 404

rails 5 action cable 服务器部署

Rails Action Cable:如何授权传入连接?