多个订阅的 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 中删除可操作的频道订阅?