LayerVault 的好人发布了一种在现有 Ruby 应用程序上添加“实时”功能的简单方法,而无需诉诸客户端 MCV 或用 Node.js 重写整个应用程序,不久前。他们的帖子显示,只要您的 rails模型通过 delay_job 和 Active:Record Observer 更新 [参考 1],您就可以更新所有客户端:
  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
从客户端 javascript 连接到 socket.io 服务器很容易。但是我不知道如何Messenger.publish_message('file_updated', "file/#{self.id}")在 Rails 服务器端实现。在帖子中他们确实提到了
report_updated 方法对单独的 Messenger 类(Web 应用程序端的 Socket.IO 接口)进行类方法调用,并报告文件已更改到适当的房间。
但我仍然不太确定如何Messager在 Rails 中实现类,以便 Active:Record Observer 能够连接到我的 socket.io 服务器并发送更新。
[PS]关于 HN 的对话表明他们使用了这个宝石
gem 的 wiki 甚至包括一个简短的演示:
 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