在 Rails 中广播消息时未调用 ActionCable 频道
Posted
技术标签:
【中文标题】在 Rails 中广播消息时未调用 ActionCable 频道【英文标题】:ActionCable channel not getting called on broadcasting message in rails 【发布时间】:2020-10-08 11:21:32 【问题描述】:首先,ActionCable 功能非常新。我一直在关注这里的教程:https://www.driftingruby.com/episodes/push-notifications-with-actioncable
创建了一个名为 web_notifications_channel
和 web_notifications_channel.rb 的频道:
class WebNotificationsChannel < ApplicationCable::Channel
def subscribed
stream_from "web_notifications_channel"
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
end
end
web_notifications_channel.js:
import consumer from "./consumer"
consumer.subscriptions.create("WebNotificationsChannel",
connected()
// Called when the subscription is ready for use on the server
,
disconnected()
// Called when the subscription has been terminated by the server
,
received(data)
// Called when there's incoming data on the websocket for this channel
console.log(`wtf`)
);
控制台中没有显示任何内容。
将 cable.yml 中的适配器设置更改为 redis 以便从控制台请求:
development:
adapter: redis
test:
adapter: test
production:
adapter: redis
url: <%= ENV.fetch("REDIS_URL") "redis://localhost:6379/1" %>
channel_prefix: community_rails_production
运行控制台命令:
ActionCable.server.broadcast 'web_notifications_channel', 'You have visited the welcome page.'
我得到的回应是:
Broadcasting to web_notifications_channel: "You have visited the welcome page."
=> 0
但是我的received
方法永远不会被调用!!我在这里疯了,因为无法理解发生了什么!我检查了一些类似的问题,但没有一个对我有帮助。
PS:我已经为 redis 添加了 gem,并从我的控制台启动了 redis。
【问题讨论】:
哈哈,我也遇到了同样的问题。我仍然不确定它是否 100% 工作。 ActionCable 及其实施存在问题。从升级到 rails 6 开始,尝试记录 redis 的控制台(看看它是否保存在那里)并祈祷它会工作:-p 我正在实现一个功能,太多了,无法处理这个 sh**。 @RocKhalil。我的 rails 已经是 6 了,但是在 redis 控制台登录什么 我知道的!我花了 2-3 天的时间才知道这是 rails 5.2 的问题;升级到 rails 6 看看是否解决了;它起作用了,有时它只是由于某种原因没有传播!我正在考虑切换到 socket.io 和节点服务器而不是 ActionCable 我什至没有默认生成的redis日志文件 您是否尝试过将 console.log 语句放在 js 文件中的connected
和 disconnected
方法中,看看它们是否被执行?如果它们没有显示,这可能意味着您没有在 application.js 文件中包含频道文件(或类似文件,具体取决于您的设置)。
【参考方案1】:
您滥用了创建 API
consumer.subscriptions.create( channel: "WebNotificationsChannel" ,
connected()
// Called when the subscription is ready for use on the server
,
disconnected()
// Called when the subscription has been terminated by the server
,
received(data)
// Called when there's incoming data on the websocket for this channel
console.log(`wtf`)
);
您也可以在您的开发工具的Network
标签中检查连接,通过WS
过滤以查看连接是否创建成功。
rails
服务器或action cable
服务器(如果您将action cable
配置为作为独立服务器运行)也有日志告诉您连接是成功还是失败,并带有详细信息错误,如果有的话。
【讨论】:
以上是关于在 Rails 中广播消息时未调用 ActionCable 频道的主要内容,如果未能解决你的问题,请参考以下文章