我正在编写一个使用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
参数并调用传入数据。
答案 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