“谁在线”使用Rails中的Devise

时间:2011-03-31 17:52:08

标签: ruby-on-rails-3 devise

使用Devise on Rails,有没有办法列出当前有活动会话的所有用户,即当前登录的用户?

聚苯乙烯。我正在寻找一个强大的解决方案,而不是像this question

中那样简单化的解决方案

5 个答案:

答案 0 :(得分:84)

只需在ApplicationController中添加after_filter

即可
after_filter :user_activity

private

def user_activity
  current_user.try :touch
end

然后在用户模型中添加在线?方法

def online?
  updated_at > 10.minutes.ago
end

你也可以创建范围

scope :online, lambda{ where("updated_at > ?", 10.minutes.ago) }

答案 1 :(得分:24)

https://github.com/ctide/devise_lastseenable

您可以使用我编写的这个gem来存储用户的'last_seen'时间戳。从那里开始,显示过去5或10分钟内last_seen的用户非常简单。

答案 2 :(得分:20)

如果您对每次访问数据库感到困扰。单。 HTTP。请求。只有一些小窗口,你可以假设用户在线;我有另一种解决方案。

使用websockets和redis,可以可靠地将用户的在线状态提升到毫秒级,而无需花费数十亿美元进行磁盘写入。不幸的是,它需要更多的工作,并有两个额外的依赖,但如果有人感兴趣我在这里做了一个非常详细的写:

How do I tell if a user is online?

答案 3 :(得分:1)

我刚刚实现了另一个版本,并且认为我会分享它以帮助其他任何人。

我只需在我的Users表中添加一个last_sign_out_at列,然后将Devise会话控制器子类化,这样我就可以覆盖destroy方法,以便在会话被销毁时设置它(用户注销):

# 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控制器。

答案 4 :(得分:0)

我们可以使用活动记录会话存储列出当前活动会话。请查看github应用页面https://github.com/mohanraj-ramanujam/online-users