我正在尝试通过在用户登录时将“1”设置为db字段来创建在线用户列表,并在他注销时将“0”设置为“0”。麻烦的是 - 如果用户刚离开网站,“1”仍然留在数据库中,所以我想要做的是在会话到期时更新它。
登录:
def create
user = User.find_by_username(params[:username])
if user && user.authenticate(params[:password])
session[:user_id] = user.id
session[:username] = user.username
remote_ip = request.remote_ip
user.update_attributes(:online => 1, :ip => remote_ip)
redirect_to root_url
else
render "new"
end
end
和注销:
def destroy
@user = User.where(:id => session[:user_id])
@user.each do |u|
u.update_attributes(:online => 0)
end
session[:user_id] = nil
session[:username] = nil
redirect_to root_url
end
有人可以建议我怎么做吗?
答案 0 :(得分:2)
你不能这样做,因为无法保证你的destroy
动作会被调用。如果用户丢失了他的互联网连接怎么办?或者浏览器崩溃了?或者周末用户是AFK?
解决方案是在user
模型上添加时间戳,例如last_seen_at
,并在用户对您的网站执行操作时更新,例如使用before_filter
:< / p>
class ApplicationController < ActionController::Base
before_filter :record_last_seen_at # TODO: Implement that method
end
然后,如果您要列出所有在线用户,请列出在最后5分钟内处于活动状态的所有用户,即您认为在线的用户。
User.where(['last_seen_at > ?', 5.minutes.ago])
您也可以使用现有的身份验证框架,例如 Authlogic ,并且您可以免费获得该功能。
答案 1 :(得分:0)
通过使用db set 1或0登录和注销实际上是不好的方式,同样从上面的回答使用last_seen_at(设计用法)我们将无法获得活动会话列表。
请参阅此github示例应用https://github.com/mohanraj-ramanujam/online-users以列出使用活动记录会话存储的在线活动会话列表。