我正在编写一个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。但我不知道怎么做。
感谢您的帮助。
答案 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
希望这有帮助。