使用Devise在Rails中的“谁在线”
使用Devise on Rails,有什么方法可以列出当前有活动会话的所有用户,即当前login的用户?
PS。 我正在寻找一个强大的解决scheme,而不是像这个问题那样简单
https://github.com/ctide/devise_lastseenable
您可以使用我写的这个gem来存储用户的'last_seen'时间戳。 从那里,在过去的5到10分钟内显示last_seen的用户是非常简单的。
只需在ApplicationController中添加after_filter
after_filter :user_activity private def user_activity current_user.try :touch end
那么在用户模型中添加在线? 方法
def online? updated_at > 10.minutes.ago end
你也可以创build范围
scope :online, lambda{ where("updated_at > ?", 10.minutes.ago) }
如果您因为每次访问数据库而感到困扰。 单。 HTTP。 请求。 只有有一个小窗口,你可以假设一个用户在线; 我有一个替代解决scheme。
使用websocket和redis,可以可靠地将用户的在线状态提升到毫秒级,而不会造成成本高达数十亿美元的磁盘写入。 不幸的是,它需要更多的工作,还有两个额外的依赖关系,但如果有人感兴趣,我在这里做了一个非常详细的写作:
如何判断用户是否在线?
我刚刚实现了另一个版本,并认为我会分享,以防其他人帮助。
我只是添加一个last_sign_out_at
列到我的用户表,然后子类化devise会议控制器,所以我可以重写销毁方法设置它当会话被销毁(用户注销):
# app/controllers class SessionsController < Devise::SessionsController def destroy current_user.update_attribute(:last_sign_out_at, Time.now) super end end
然后在我的用户模型中,我有一个方法来检查用户是否在线:
class User < ActiveRecord::Base def online? if current_sign_in_at.present? last_sign_out_at.present? ? current_sign_in_at > last_sign_out_at : true else false end end end
你也需要告诉Devise在你的路由中使用新的Sessions控制器。
我们可以使用活动logging会话存储列出当前活动会话。 请看github应用程序页面https://github.com/mohanraj-ramanujam/online-users 。