0

我正在编写一个 Rails 应用程序,它需要跟踪用户的状态以查看他们是否可用、忙碌或离线。我正在使用 private_pub gem,它在下面使用 Faye。当用户登录时,他订阅频道 /user/[: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。但我不知道怎么做。

谢谢你的帮助。

4

1 回答 1

1

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

宝石文件:

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 在用户模型中读取它。

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

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

希望这可以帮助。

于 2012-07-25T18:46:10.607 回答