Не удается получить доступ к данным из ActionCable на интерфейсе React

Я пытаюсь транслировать сообщения, принадлежащие определенной игре, из бэкэнда rails, используя actioncable.

В моем messages_controller:

  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

В моем messages_channel:

  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.info("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.info(`Received Data: ${data}`);

    this.onUpdate(data);
  };

  this.connected = () => {
    console.info(`this.connected`);
  };

  this.disconnected = () => {
    console.warn(`this.disconnected.`);
  };

  this.rejected = () => {
    console.warn('I was rejected! :(');
  };
}

Проблема в том, что на стороне клиента я могу нажать «подключено», «отключено» и «отклонено», но не могу нажать «получено».

Во время работы сервера и клиента, если я посмотрю на бэкэнд rails в терминале, я увижу следующее:

MessagesChannel is transmitting the subscription confirmation MessagesChannel is streaming from # Started GET "/api/v1/cable" for 127.0.0.1 at 2019-03-21 10:29:09 -0400 Started GET "/api/v1/cable/" [WebSocket] for 127.0.0.1 at 2019-03-21 10:29:09 -0400 Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket) Could not execute command from ({"command"=>"subscribe", "identifier"=>"{\"channel\":\"MessagesChannel\",\"game_id\":\"15\"}"}) [NoMethodError - undefined method []' for nil:NilClass]: /Users/flatironschool/Development/code/Flatiron/mod5/project/deep_forest_api/app/channels/messages_channel.rb:3:in subscribed' | /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 block 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 block (3 levels) in '

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
670
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я получил помощь от TCF в моей школе.

В моем канале сообщений я изменил его на:

  def subscribed
    @game = Game.find(params[:id][:game_id])
    stream_for @game
  end

Итак, stream_for вместо stream_from.

Кроме того, я также переключился на использование пакета npm react-actioncable-provider.

Мой javascript на стороне клиента находится в React и выглядит так:

import { ActionCable } from 'react-actioncable-provider';
import React, { Component, Fragment } from 'react';
import { CABLE, AUTH_HEADERS } from '../constants';
import { connect } from 'react-redux';
import Message from '../components/Message';

class Cable extends Component {

  render () {
    console.info("Cable.js")
    return (
      <Fragment>
        <ActionCable
          key = {this.props.game_id}
          channel = {{ channel: "MessagesChannel", game_id: this.props.game_id }}
          onReceived = {(data) => console.info("handleReceived: ", data)}
        />
    </Fragment>
    )
  }
}

const mapStateToProps = state => {
  return { state }
}

const mapDispatchToProps = dispatch => {
  return {
    getMessages: data => dispatch({ type: "LOAD_MSGS", payload: data })
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(Cable);

Теперь я могу получать ответы от ActionCable.

Другие вопросы по теме