2

我正在编写一个使用 WebSockets 与其他机器通信的 Rails 应用程序(此过程中没有浏览器和客户端逻辑)。我有一个频道:

class MachinesChannel < ApplicationCable::Channel
  def subscribed
    ...
  end

  def unsubscribed
    ...
  end

  def handle_messages
    ...
  end
end

要接收数据,我知道的唯一方法是 JavaScript 客户端:

ActionCable.createConsumer('/cable').subscriptions.create 'MachinesChannel',
  received: (message) ->
    @perform('handle_messages')

我可以通过方法从 JS 调用服务器端方法@perform()

有什么办法可以省略 JS 部分并以某种方式直接处理传入的数据MachinesChannel

理想的情况是让handle_messages方法接受一个data参数并让这个方法调用传入的数据。

4

2 回答 2

2

在查看ActionCable源代码后,我得到了以下解决方案。你只需要创建一个MachinesChannel你想要被调用的方法,例如handle_messages(data). 然后,在连接到您的 websocket 的客户端中,您需要以以下格式发送消息(以 ruby​​ 为例):

id = { channel: 'MachinesChannel' }
ws = WebSocket::Client::Simple.connect(url)
ws.send(JSON.generate(command: 'message', identifier: JSON.generate(id), data: JSON.generate(action: 'handle_messages', foo: 'bar', biz: 'baz')))

action必须是您要在其中调用的方法的名称MachinesChannel。其余的键值是你想要的。这是您可以在ActionCable频道中收到的日期。

最近发布了一个 gem action_cable_client,它似乎非常适合这种用法。我没有用过,所以我不知道它是如何工作的。

于 2016-04-12T08:28:24.390 回答
2

代替:

def handle_messages
 ...
end

这对我有用:

def receive(data)
  puts data
  ...
end
于 2018-05-03T09:32:03.247 回答