Я пытаюсь транслировать сообщения, принадлежащие определенной игре, из бэкэнда рельсов, используя actioncable.
В моем диспетчере сообщений:
def create
@game = Game.find(message_params[:game_id])
@message = Message.new(message_params)
if @message.save
serialized_data = ActiveModelSerializers::Adapter::Json.new(
MessageSerializer.new(@message)
).serializable_hash
MessagesChannel.broadcast_to @game, serialized_data
head :ok
end
end
В моем канале сообщений:
def subscribed
@game = Game.find(params[:id][:game_id])
stream_from @game
end
На внешнем интерфейсе я использую этот файл:
import ActionCable from 'actioncable';
import { CABLE } from "../constants";
export default function MessagesSubscription(
game_id,
{ onUpdate = () => {} } = {}
) {
// 2. Define our constructor
this.cable = ActionCable.createConsumer(CABLE);
// this.channel;
this.game_id = game_id;
this.onUpdate = onUpdate;
// 3. Define the function we will call to subscribe to our channel
this.subscribe = () => {
console.log("subscribed")
this.channel = this.cable.subscriptions.create(
{ channel: 'MessagesChannel', id: this.game_id },
{
connected: this.connected,
disconnected: this.disconnected,
received: this.received,
rejected: this.rejected,
}
);
};
// 4. Define our default ActionCable callbacks.
this.received = (data) => {
console.log(`Received Data: ${data}`);
this.onUpdate(data);
};
this.connected = () => {
console.log(`this.connected`);
};
this.disconnected = () => {
console.warn(`this.disconnected.`);
};
this.rejected = () => {
console.warn('I was rejected! :(');
};
}
Проблема в том, что на стороне клиента я могу нажать «подключен», «отключен» и «отклонен», но я не могу нажать «получен».
Во время работы сервера и клиента, если я посмотрю на серверный рельс в терминале, я увижу следующее:
MessagesChannel передает подтверждение подписки MessagesChannel транслируется с # StartedGET "/ api / v1 / cable" для 127.0.0.1 в 2019-03-21 10:29:09 -0400 Запуск GET "/ api / v1 / cable /" [WebSocket] для 127.0.0.1 в 2019-03-2110:29:09 -0400 Успешно обновлен до WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Обновить, HTTP_UPGRADE: websocket) Не удалось выполнить команду из ({"command" => "subscribe", "identifier" => "{\" channel\ ": \" MessagesChannel \ ", \" game_id \ ": \" 15 \ "}"}) [NoMethodError - неопределенный метод []' for nil:NilClass]:
/Users/flatironschool/Development/code/Flatiron/mod5/project/deep_forest_api/app/channels/messages_channel.rb:3:in
подписан '|/Users/flatironschool/.rvm/gems/ruby-2.6.1/gems/actioncable-5.2.2.1/lib/action_cable/channel/base.rb:179:in block in subscribe_to_channel' |
/Users/flatironschool/.rvm/gems/ruby-2.6.1/gems/activesupport-5.2.2.1/lib/active_support/callbacks.rb:109:in
блок в run_callbacks '|/Users/flatironschool/.rvm/gems/ruby-2.6.1/gems/activesupport-5.2.2.1/lib/active_support/execution_wrapper.rb:83:in wrap' |
/Users/flatironschool/.rvm/gems/ruby-2.6.1/gems/actioncable-5.2.2.1/lib/action_cable/engine.rb:68:in
блок (3 уровня) в '