更新faye事件侦听器中的activerecords

时间:2012-07-18 04:11:02

标签: ruby-on-rails faye rackup

我正在编写一个rails应用程序,它需要跟踪用户的状态,以查看他们是否可用,忙碌或离线。我正在使用private_pub gem,它使用下面的Faye。当用户登录时,他订阅频道/用户/ [:user_id]。我想在使用Faye的订阅事件监听器订阅时将用户的状态更新为ONLINE。我在private_pub.ru文件的末尾添加了这段代码:

server = PrivatePub.faye_app

server.bind :subscribe do |client_id, channel|
  if /\/user\/*/.match(channel)
      m = /\/user\/(?<user_id>\d+)/.match(channel)
      user_id = m[:user_id]
  end
  user = User.find(user_id)
  user.status = 1 # 1 means online
end

run server

问题是每次用户订阅瘦服务器报告时:

[ERROR] [Faye::RackAdapter] uninitialized constant User

我想我需要某些文件才能在rackup文件中使用activerecords。但我不知道怎么做。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在我们的项目中,我们决定将redis用于类似案例。

的Gemfile:

gem 'redis-objects'

Faye:使用redis-rb写作状态

require 'redis'
Redis.current = Redis.new(:host => '127.0.0.1', :port => 6379)

# init faye server
...

server.bind(:subscribe) do |client_id, channel|
  if /\/user\/*/.match(channel)
    m = /\/user\/(?<user_id>\d+)/.match(channel)
    Redis.current.set("user:#{m[:user_id]}:online_status", "1")
  end
end

Rails:使用redis-objects gem在User模型中读取它。

class User < ActiveRecord::Base
  include Redis::Objects
  value :online_status
end

@user.online_status # returns "1" if channel is connected

希望这有帮助。