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