从 Rail Active 调用 Socket.io:记录回调或观察者
Posted
技术标签:
【中文标题】从 Rail Active 调用 Socket.io:记录回调或观察者【英文标题】:Call Socket.io from Rail Active:Record callback or observer 【发布时间】:2013-02-17 15:52:11 【问题描述】:不久前,LayerVault 的好人发布了一种在现有 Ruby 应用程序上添加“实时”功能的简单方法,而无需借助客户端 MCV 或用 Node.js 重写整个应用程序。他们的帖子显示,只要您的 rails Models 通过 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 服务器很容易。但是我不知道如何在 Rails 服务器端实现Messenger.publish_message('file_updated', "file/#self.id")
。他们在帖子中确实提到了
report_updated 方法对单独的 Messenger 类(我们在 Web 应用程序端的 Socket.IO 接口)进行类方法调用,并报告文件已更改到相应的房间。
但我仍然不太确定如何在 Rails 中实现 Messager
类,以便 Active:Record Observer 能够连接到我的 socket.io 服务器并发送更新。
[PS] HN 上的对话表明他们使用了this gem
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
【问题讨论】:
【参考方案1】:Messenger 类没有太多内容。您所需要的只是创建连接,触发消息,然后结束。这是我们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
【讨论】:
成功了。除了在我的情况下修改了require 'socketio-client' to require 'socketIO'
以上是关于从 Rail Active 调用 Socket.io:记录回调或观察者的主要内容,如果未能解决你的问题,请参考以下文章