Rails 5 app(Action Cable)作为Socket.io服务器和客户端

时间:2016-05-23 03:55:19

标签: ruby-on-rails sockets heroku ruby-on-rails-5 actioncable

我现在熟悉Action Cable(Rails 5功能)作为websockets的发射器或服务器。但是,我应该使用一个通过websockets发送数据的API(例如' socket.provider.com?token = 12345')。

我使用socket.io-client-simple(https://github.com/shokai/ruby-socket.io-client-simple)使用普通的Ruby文件进行了一些测试并且它可以工作,但我不确定这对于部署的Rails应用程序如何工作。我猜我需要一个单独的进程,它不断监听API提供程序发出的事件。有没有人做过类似的事情?我将使用Heroku进行部署。

注意:我认为使用客户端方法接收websockets,然后将它们发布到我的Rails应用程序(即Javascript Socket.IO库)不是一个选项,因为我需要接收AND持久化一些数据来来自事件的实时而不依赖于至少一个客户的连接性。

我也想知道是否有任何方法可以自动设置行动电缆作为事件的监听者'不知何故。到目前为止,Haven尚未阅读有关该主题的任何内容,但我很乐意看到有关该方向的一些建议。

更新:这是我目前使用的Ruby代码连接到提供商的websockets API:

require 'rubygems'
require 'socket.io-client-simple'

socket = SocketIO::Client::Simple.connect 'https://api.provider.com', token: '12345'

socket.on :connect do
  puts "connect!!!"
end

socket.on :disconnect do
  puts "disconnected!!"
end

socket.on :providerevent do |data|
  puts data
end

socket.on :error do |err|
  p err
end

puts "please input and press Enter key"
loop do
  sleep 100
end

1 个答案:

答案 0 :(得分:3)

ActionCable无法单独侦听外部网站的事件,因此您必须将socket.io和ActionCable结合起来。

ActionCable可以像这样向频道发送更新:

ActionCable.server.broadcast "channel_name", param1: your_param1, param2: your_param2

在发生事件时更新频道。该 您频道的coffeescript文件的received操作是您必须使用它执行操作的地方。 根据我的理解,你在控制器中寻找类似的东西,你将在那里听取事件:

def listen
  socket.on :connect do
    # persist your data 
    # example: @post = Post.create(...)
    ActionCable.server.broadcast "channel_name", post_title: @post.title
  end
end

并在你的channel_name.coffee中:

received: (data) ->
  console.log(data["post_title"])
  # do something

通过此设置,您将从api接收活动,并将其广播到您的频道。页面是每次套接字收到事件时设置的通道都会更新。

您应该首先遵循DDH的教程,然后您可能会更好地理解我的解决方案(这很容易实现)。