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

如何在 ActionCable rails-5-api 应用程序中获取 current_user?

ActionCable 不再在生产环境中工作

ActionCable 频道实例是不是在客户端之间共享?

如何使用 RSpec 测试 ActionCable 频道?

Rails 4 和 ActionCable