ActionCable出现“未找到订阅类”问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActionCable出现“未找到订阅类”问题相关的知识,希望对你有一定的参考价值。

我使用Rails 5.1.5,我有以下代码。

应用程序/信道/ application_cable / channel.rb

module ApplicationCable
  class Channel < ActionCable::Channel::Base
  end
end

应用程序/信道/ application_cable / connection.rb

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user
    def connect
      self.current_user = find_verified_user
      logger.add_tags 'ActionCable', current_user.slug
    end
    private
    def find_verified_user
      if verified_user = env['warden']&.user
        verified_user
      else
        reject_unauthorized_connection
      end
    end
  end
end

应用程序/信道/ notifications_count_channel.rb

class NotificationsCountChannel < ApplicationCable::Channel
  def subscribed
  end
end

JS代码包含:

global.App.cable.subscriptions.create({ channel: 'NotificationsCountChannel',
  connected: () => {
    console.log('connected');
  },
  rejected: () => {
    console.log('rejected');
  },
  disconnected: () => {
    console.log('disconnected');
  },
  received: (data) => {
    console.log(data);
  },
});

客户端可以成功连接到位于'/ cable'默认路径的WebSocket。但是订阅NotificationsCountChannel并不成功。这是日志:

Started GET "/cable" for 127.0.0.1 at 2018-02-24 20:50:31 +0300
Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2018-02-24 20:50:31 +0300
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
Subscription class not found: "NotificationsCountChannel"

此外,我无法在rails控制台中检查NotificationsCountChannelNameError (uninitialized constant NotificationsCountChannel)

看起来Rails没有加载NotificationsCountChannel类。 运行bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths'会给出一个不包含app/channels的路径列表。它可以通过添加来修复 config.autoload_paths += %W(#{config.root}/app/services)配置/ application.rb但它没有解决主要问题。

我错过了什么?

答案

原来答案很简单:缺乏关注。 实际上channels dir是项目的根目录,而不是app目录。

以上是关于ActionCable出现“未找到订阅类”问题的主要内容,如果未能解决你的问题,请参考以下文章

Websocket握手期间的Rails ActionCable错误

ActionCable Rails 5 (Passenger) - 失败:WebSocket 握手期间出错:意外响应代码:404

在 Rails 中的控制台无法使用 Actioncable 广播

application 和 actioncable 不会共享 cookie

ActionCable - 响应错误

Rails 4 和 ActionCable