从 Rails 监听 Juggernaut 事件

Posted

技术标签:

【中文标题】从 Rails 监听 Juggernaut 事件【英文标题】:Listening to Juggernaut events from Rails 【发布时间】:2011-10-20 19:44:05 【问题描述】:

我正在使用 Juggernaut、Redis、SQLite 和 Rails 3.1 构建一个简单的实时聊天

我想在另一个用户断开连接时(例如他关闭窗口)给每个用户写一条新消息,这是为了监听 Juggernaut 的客户端断开连接事件。

Juggernaut docs 说我可以在服务器端(Ruby)做到这一点

Juggernaut.subscribe do |event, data|
  # Use event/data
end

问题是我不知道应该将此代码放在我的 Rails 应用程序中的什么位置(控制器、模型、观察者?)。我已经尝试将它放入模型中,但是服务器不会响应任何将代码块放入模型中的请求。

我认为我应该从服务器端收听该事件,因为如果用户因为关闭窗口而断开连接,那么我没有该用户的“客户端”。

可能我错过了有关剑圣如何工作的一些信息。任何帮助将不胜感激。

【问题讨论】:

这里是代码使用示例:github.com/maccman/holla/blob/original/app/models/roster.rb 是的,我以前见过,但这似乎不是一个正常的导轨模型。该模型继承自 SuperModel::Base 而不是 ActiveRecord::Base。 github.com/maccman/supermodel,这不是一个普通的rails项目,他用SuperModel替换了ActiveRecord 是的,我知道那个项目,它来自剑圣的作者。但我需要从普通的 Rails 应用程序(不使用该 SuperModel)中监听事件 Mouarf 可能正在使用观察者或类似的东西......我不知道剑圣很酷:) 【参考方案1】:

好的,我终于回答自己了:

我发现问题是当进程运行调用 Juggernaut.subscribe 时,它​​会冻结,直到触发 Juggernaut 事件。因此,您无法从服务器进程调用 Juggernaut,您需要一个新进程来运行该代码。

我的代码现在看起来像这样: 型号:

class MyModel < ActiveRecord::Base

  class << self
    def subscribe
      Juggernaut.subscribe do |event, data|
        case event
          when :subscribe
            # do something
          when :unsubscribe
            # do something else
        end
      end
    end
  end

end

然后我有一个 ruby​​ 脚本 myapp/scripts/juggernaut_listener:

#!/usr/bin/env ruby
require File.expand_path('../../config/environment',  __FILE__)

puts "Starting juggernaut listener"
MyModel.subscribe

所以在吃完服务器午餐后,我需要像这样给 Juggernaut 监听器吃午餐:

./script/participations_listener

(注意你应该给脚本+x)。

希望对某人有所帮助!

【讨论】:

以上是关于从 Rails 监听 Juggernaut 事件的主要内容,如果未能解决你的问题,请参考以下文章

使用 juggernaut 作为 rails 插件时遇到问题

jQuery是怎样监听到事件的?

Rails 3.1 在 Ubuntu 11.10 上使用 Socket.io/Juggernaut

使用 rails 应用程序启动 Juggernaut 和 Redis

如何在 Internet Explorer 中测试 Rails Juggernaut?

Rails 3.1 + Juggernaut Instant Messenger 的工作示例?