从 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:记录回调或观察者的主要内容,如果未能解决你的问题,请参考以下文章

Rail片段缓存如何使您的应用受益,即阻止数据库调用?

英语railway和rail区别是啥?

使用 Active Directory 令牌从 Angular 到 Web API 应用程序进行安全 API 调用

rail是啥意思

Socket I/O模型之select模型

Rail Fullstack Web 开发