从铁路调用Socket.io Active:loggingcallback或观察者

在LayerVault的好人发布了一个简单的方法来添加现有的Ruby应用程序的“实时”function,而不诉诸客户端MCV或重写整个应用程序在Node.js,前一阵子。 他们的post表明,只要你的rails 模型被更新,你可以更新到所有的客户端[参考1]通过delay_job&Active:Record Observer:

class FileObserver < ActiveRecord::Observer observer :lv_file def after_commit(record) record.delay.report_updated end end 

  class LVFile < ActiveRecord::Base def report_updated Messenger.publish_message('file_updated', "file/#{self.id}") end end 

[参考文献1] http://layervault.tumblr.com/post/31462727280/rails-in-realtime-part-2

从客户端连接到socket.io服务器很容易。 但是我迷失在轨道服务器端如何实现Messenger.publish_message('file_updated', "file/#{self.id}") 。 在post中他们提到了这一点

report_updated方法调用一个单独的Messenger类 (我们的Web应用程序端的Socket.IO接口)的类方法调用,并报告文件已经改变到适当的房间。

但是我仍然不确定如何在Rails中实现Messager类,以便Active:Record Observer能够连接到我的socket.io服务器并发送更新。

[PS]在HN上的对话表明他们利用这个gem

gem的维基甚至包括一个简短的演示:

  require 'SocketIO' client = SocketIO.connect("http://localhost", sync: true) do before_start do on_message {|message| puts message} on_disconnect {puts "I GOT A DISCONNECT"} end after_start do emit("loadLogs", "/var/www/rails_app/log/production.log") end end puts "socket still running" loop do sleep 10 puts 'zzz' end 

Messenger类没有太多的东西。 所有你需要的是创build连接,发射消息,然后包装起来。 这是我们的messenger.rb的全部:

 require 'socketio-client' class Messenger def self.send_message!(name, args) begin SocketIO.connect(MESSENGER_SOCKETIO_ADDRESS, sync: true) do after_start do emit(name, args) disconnect end end rescue end end end