如何在没有JS的ActionCable Channel中接收数据?

时间:2016-04-06 08:46:17

标签: ruby-on-rails actioncable

我正在编写一个使用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')

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

有没有办法省略JS部分,并以某种方式直接处理MachinesChannel中的传入数据?

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

2 个答案:

答案 0 :(得分: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似乎非常适合这种用法。我还没有使用它,所以我不知道它是如何运作的。

答案 1 :(得分:0)

而不是:

def handle_messages
 ...
end

这对我有用:

def receive(data)
  puts data
  ...
end