Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用ActionCable作为API_Ruby On Rails_Api_Ruby On Rails 5_Actioncable - Fatal编程技术网

Ruby on rails 如何使用ActionCable作为API

Ruby on rails 如何使用ActionCable作为API,ruby-on-rails,api,ruby-on-rails-5,actioncable,Ruby On Rails,Api,Ruby On Rails 5,Actioncable,我使用Rails 5 beta 1和ActionCable构建了一个非常简单的应用程序,以显示用户何时在线并允许他们互相发送消息 现在,我基本上希望使用ActionCable的客户端部分,在另一个应用程序(不在Rails 5上运行)的上下文中实现它,并将其与第一个应用程序连接以发送和接收数据(例如用户或消息的在线状态) 为了从第二个应用程序发送数据,我假设,我可以简单地发出一个AJAX POST请求。问题是:如何从第二个应用订阅第一个应用的开放连接? 甚至:我如何通过API从另一个应用程序订阅R

我使用Rails 5 beta 1和ActionCable构建了一个非常简单的应用程序,以显示用户何时在线并允许他们互相发送消息

现在,我基本上希望使用ActionCable的客户端部分,在另一个应用程序(不在Rails 5上运行)的上下文中实现它,并将其与第一个应用程序连接以发送和接收数据(例如用户或消息的在线状态)

为了从第二个应用程序发送数据,我假设,我可以简单地发出一个AJAX POST请求。问题是:如何从第二个应用订阅第一个应用的开放连接?

甚至:我如何通过API从另一个应用程序订阅Rails应用程序的ActionCable连接

我的猜测是,我想在我的第二个应用程序中加入这个咖啡脚本:

App.appearance = App.cable.subscriptions.create "AppearanceChannel",
  connected: ->
    # Called when the subscription is ready for use on the server

  disconnected: ->
    # Called when the subscription has been terminated by the server

  received: (data) ->
    # ...

实际上,您需要在其他应用程序()中包含ActionCable JS代码的副本或端口

更新:我最近发布了一个名为actioncable js的npm包,它提供了Ruby on Rails 5的actioncable CofeeScript到标准js的直接端口,供Rails之外使用:

因为ActionCable只是HTML5 WebSockets之上的一层,所以您还可以使用原始WebSockets JS代码(或任何第三方库)来处理消息传递

ActionCable消息协议在此处有所记录:。为了方便起见,我将粘贴以下内容:

  • 连接到操作电缆URL
  • 连接成功后,发送订阅消息

    • 订阅消息JSON应该如下所示:
      
      {“command”:“subscribe”,“identifier”:“{\“channel\”:\“MeshRelayChannel\”}”}
    • 您应该会收到如下消息:
      {“标识符”=>“{\“频道\:\“MeshRelayChannel\”}”,“键入”=>“确认订阅”}
  • 订阅后,您可以发送消息

    • 确保操作字符串与ActionCable服务器上的数据处理方法名称匹配
    • 您的消息JSON应该如下所示:
      {“command”:“message”,“identifier”:“{\“channel\”:\“MeshRelayChannel\”,“data”:“{\”to\”:“user1\”,“message\”:“hello from user2\”,“action\”:“chat\”}
    • 收到的消息应该看起来差不多
  • 注:

    • 发送到服务器的每条消息都有一个命令和标识符密钥
    • 通道值必须与ActionCable服务器上的通道类名称匹配
    • 标识符
      数据
      是冗余的jsonified
  • 因此,例如(在ruby中)


    虽然mwalsher的解决方案对我非常有帮助,但我最近在Rails存储库中发现了一个pull请求,并为我的问题提供了一个正式的解决方案

    我想,在不久的将来,这将添加到主文档中。以下是actioncable npm官方软件包的链接:

    npm install actioncable --save
    
    您可以将其与mwalsher的解决方案类似地用于任何JS应用程序。只需安装npm软件包:

    npm install actioncable --save
    
    下面是文档中的JS示例:

    ActionCable = require('actioncable')
    
    var cable = ActionCable.createConsumer('wss://RAILS-API-PATH.com/cable')
    
    cable.subscriptions.create('AppearanceChannel', {
      // normal channel code goes here...
    });
    

    编辑:拉取请求已经合并了一段时间,现在描述是官方的一部分-只是还没有在Rails指南中。

    是的。我也在调查这件事。不过,我觉得这并不那么直截了当。至少对我来说不是。有些部分需要调整,不能简单地复制。不幸的是,ES6端口似乎无法与最新版本的Rails 5配合使用。更新了我的答案,并添加了ActionCable JS的直接端口链接:。希望这有帮助!非常非常好的解决方案。谢谢你把这些放在一起!这是非常有帮助的。我决定自己发布一个答案,因为我刚刚在Rails repo上发现了一个带有官方NPM包的pull请求。如何使用socket.io客户端连接到
    MeshRelayChannel
    ?@jim broski请分享这两个应用程序的开放存储库,这对rails和actioncable的新手非常有用。至少在上面分享一个帖子。这将是有用的。