Класс подписки не найден MyChannel в ActionCable

У меня возникла проблема при работе с Action Cable: всякий раз, когда я запускаю свою программу, я получаю сообщение об ошибке Subscription Класс не найден ConversationChannel

и когда я пытаюсь отправить сообщение, я получаю этот журнал

Успешно обновлен до WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket) Класс подписки не найден: "ConversationChannel" Не удалось выполнить команду из {"command" => "message", "identifier" => "{\" канал \ ": \" ConversationChannel \ "}", "data" => "{\" сообщение \ ": [{\" имя \ ": \" идентификатор_ беседы \ ", \" значение \ ": \" 2 \ "} , {\ "name \": \ "amitian_id \", \ "value \": \ "1 \"}, {\ "name \": \ "body \", \ "value \": \ "nmm \ "}], \" действие \ ": \" говори \ "}"}) [RuntimeError - Невозможно найти подписку с идентификатором: {"channel": "ConversationChannel"}]: C: /RailsInstaller/Ruby2.3.0/lib /ruby/gems/2.3.0/gems/actioncable-5.0.1/lib/action_cable/connection/subscriptions.rb:74:in find' | C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actioncable-5.0.1/lib/action_cable/connection/subscriptions.rb:53:in perform_action '| C: /RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actioncable-5.0.1/lib/action_cable/connection/subscriptions.rb: 17: in execute_command' | C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actioncable-5.0.1/lib/action_cable/connection/base.rb:88:indispatch_websocket_message '| C: /RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/actioncable-5.0.1/lib/action_cable/server/worker.rb: 58: в `блокировать при вызове '

ConversationChannel.rb

class ConversationChannel < ApplicationCable::Channel
  def subscribed
    # stream_from "some_channel"
    stream_from "conversations-#{current_amitian.id}"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
    stop_all_streams
  end

  def speak(data)

    message_params = data['message'].each_with_object({}) do |el, hash|
      hash[el.values.first] = el.values.last
    end

    ActionCable.server.broadcast(
      "conversations-#{current_amitian.id}",
      message: message_params
    )
  end 
 end

conversation.js

App.conversation = App.cable.subscriptions.create("ConversationChannel", {
  connected: function() {

  },
  disconnected: function() {

  },
  received: function(data) {
  console.log(data['message']);
  },
  speak: function(message) {
    return this.perform('speak' , {
    message: message
    });
  }
});

$(document).on('submit', '.new_message', function(e) {
  e.preventDefault();
  var values = $(this).serializeArray();
  App.conversation.speak(values);
  $(this).trigger('reset');
});

connection.rb

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_amitian

    def connect
        self.current_amitian = find_verified_amitian
    end

    protected

    def find_verified_amitian
        if(current_amitian = env['warden'].amitian)
            current_amitian
        else
            reject_unauthorized_connection
        end
    end
  end
end

может ли кто-нибудь сказать мне, почему он не может найти мой conversation_channel.rb файл, используя приведенный выше файл журнала?


person Alaap Dhall    schedule 11.06.2017    source источник


Ответы (3)


Я решил это, переместив файл канала на один каталог вверх.

С app/channels/application_cable/conversation_channel.rb по app/channels/conversation_channel.rb

person Suganya    schedule 13.06.2017

Вы должны указать полное имя Module :: Class в коде вашего клиента (JS). Например, если ваш ConversationChannel класс находится внутри ApplicationCable модуля, тогда в вашем клиенте вместо ConversationChannel вам нужно сделать ApplicationCable::ConversationChannel

person Ketan    schedule 13.10.2017
comment
Я обнаружил, что мне нужно также включить класс Channel: ApplicationCable::Channel::CountsChannel - person Chiperific; 15.07.2021

Ваш файл должен иметь имя conversation_channel.rb, поскольку snake_case - это соглашение rails для имен файлов каналов.

person Laith Azer    schedule 11.06.2017
comment
В своем сообщении вы упомянули, что имя вашего файла ConversationChannel.rb. Разве это не так? Проверить, нет ли опечаток в имени файла? - person Laith Azer; 12.06.2017