一起使用 Actioncable 和 Rails 5 API 模式

Using Actioncable and Rails 5 API mode together

我正在创建一个非常基本的聊天应用程序。我的目标是拥有一个 Rails API 后端,然后构建一个 IOS、Android、Web 和桌面客户端。这纯粹是为了探索Websockets和移动开发。

我没用过Actioncable,对Websockets的了解也很有限。我想知道的是我是否可以在 Rails API 上设置 Actioncable 并让它与 Node 通信(例如)。

Actioncable 是否与其他 Websocket 一样?我可以通过 ws://<host>/cable 从我的 Node 应用程序连接到它并在任何客户端和 Rails 之间有一个功能性的 pub-sub 系统吗?

很抱歉,如果这没有意义,我很难措辞:)

谢谢!

你真的可以!

  1. 就像创建任何 api 应用程序一样,使用生成器

    rails new my_app --api
    
  2. 创建your_channel

    rails generate channel your_channel
    
  3. routes.rb

    中添加挂载路径
    mount ActionCable.server => '/cable'
    
  4. /app/channels/your_channel.rb

    中的订阅方法允许流式传输
    class YourChannel < ApplicationCable::Channel
    
      def subscribed
        stream_from 'messages'        #  <----- Stream Name Here
      end
    
      def unsubscribed
        # Any cleanup needed when channel is unsubscribed
      end
    
    end
    
  5. 从应用程序的任何其他部分调用 ActionCable.server.broadcast 以流式传输

    ActionCable.server.broadcast 'messages', message: 'ping'
    
  6. 现在用你的前端来测试一下。既然你告诉你想要 iOS Android 并且还提到了节点,我假设你正在使用 (或者会选择使用) react-native

    import ActionCable from 'react-native-actioncable';
    const cable = ActionCable.createConsumer("ws://localhost:3000/cable");
    
    class YourReactClass extends React.Component {
    
        # add or update the following
    
        componentDidMount = () => {
            console.log("componentDidMount executed");
            this.subscription = cable.subscriptions.create("OrderChannel", {
                connected: function() { console.log("connected: action cable") },
                    disconnected: function() { console.log("disconnected: action cable") },
                    received: function (data) { console.log(data) }
                }
            )
        };
    
        componentWillUnmount () {
            this.subscription &&
            cable.subscriptions.remove(this.subscription)
        }
    
    }
    

一切顺利,在此基础上构建您的逻辑...如果您有任何问题,请告诉我。