2

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
4

1 回答 1

0

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
于 2013-02-17T18:55:09.027 回答