ActionCable 频道在 Rails 插件之外无法访问
Posted
技术标签:
【中文标题】ActionCable 频道在 Rails 插件之外无法访问【英文标题】:ActionCable channel not accessible outside rails plugin 【发布时间】:2016-04-17 20:15:34 【问题描述】:我正在尝试创建一个公开 ActionCable 频道的 gem,但我无法让它工作。
这是我的宝贝
# lib/my_channel.rb
class MyChannel < ActionCable::Channel::Base
def wait(data)
# logic ...
end
end
# lib/engine.rb
module MyApp
class Engine < ::Rails::Engine
isolate_namespace MyApp
end
end
然后我将 gem 添加到我的主应用程序 Gemfile
,运行 bundle install
,启动控制台并运行 MyChannel
。这不会产生和错误,这意味着该频道已正确包含。
然后我将它添加到我的主应用程序中
// application.js
var socket = "ws://localhost:3000/cable";
var cable = ActionCable.createConsumer(socket);
cable.subscriptions.create( "channel": "MyChannel" ,
received: function()
// ...
);
但是我收到了这个错误
Subscription class not found ("command"=>"subscribe", "identifier"=>"\"channel\":\"MyChannel\"")
我错过了什么?
【问题讨论】:
您使用的是哪个版本的 Action Cabel? Rails Beta1? @JohnKacz 是的,没错 您的 MyChannel 类中似乎没有定义订阅方法。来自文档 (link):“只需调用App.cable.subscriptions.create
即可设置订阅,这将调用 AppearanceChannel#subscribed
”
@JohnKacz 不,没必要
好的,抱歉。我还没有对 Action Cable 做太多事情(它在我的清单上),但为什么没有必要呢?我看到的频道类的每个示例都有一个订阅方法。
【参考方案1】:
此答案不适用于 gems,仅适用于 Rails 应用程序中的频道。
您的my_channel.rb
位于错误的位置。我不确定测试版之间的行为是否发生了变化(我使用的是 beta3),但它应该位于app/channels/application_cable/
。
我遇到了同样的问题,并意识到我的频道文件命名不当(host.rb
而不是host_channel.rb
)。重命名文件后,它开始工作了。
我相信默认情况下仅使用特定位置和命名方案 (app/channels/application_cable/*_channel.rb
) 搜索频道文件。
【讨论】:
我想我当时尝试了所有可能的路径,但我会再试一次,看看它是否有效。它会在 gem 中自动公开,还是我必须创建一个 rails 引擎? 自动曝光。顺便说一句,我忘了将 /application_cable 部分添加到路径中。记得添加那个!我编辑了帖子以添加它。 对不起,我没有意识到你正在制作宝石!您应该以某种方式让 Cable 了解您的频道。恐怕我帮不了你。 好的,我看了一下源码。在 github.com/rails/rails/blob/master/actioncable/lib/action_cable/… 中搜索这些类。因此,您应该以某种方式将您的班级列入该名单。 我又查看了源代码。这些类在 github.com/rails/rails/blob/master/actioncable/lib/action_cable/… 中加载。 config.channel_paths -list 可以通过初始化器中的 ActionCable.server.config 访问。希望这会有所帮助!以上是关于ActionCable 频道在 Rails 插件之外无法访问的主要内容,如果未能解决你的问题,请参考以下文章
Rails 5 - ActionCable - 无法升级到 WebSocket