如何判断给定的Devise用户是否已立即登录?

时间:2012-01-12 15:39:51

标签: ruby-on-rails-3.1 devise

在使用Devise的Rails应用中,有没有办法判断特定用户是否已立即签署

我知道视图助手user_signed_in?。我正在寻找的更像是:

User.all.each do |user|
  puts user.signed_in?
end

我看到Devise已向current_sign_in_at添加了users列。但是,当用户退出时,这不会设置为NULL,因此我无法对此进行测试。

如何检查用户当前是否已登录?

4 个答案:

答案 0 :(得分:6)

您可以在ApplicationController中添加 before_filter ,以便在users表的 last_request_at 字段中设置当前日期/时间,您必须先通过该字段添加迁移。在before_filter调用的方法中,您当然要确保首先验证用户身份。并且您可能希望除了过滤器之外不需要身份验证的操作。

然后,假设您在用户模型中包含 Timeoutable 模块,您可以通过这样的调用来查看用户的会话是否是最新的:

user.timedout?(user.last_request_at)

Timeoutable模块中定义的 timedout?(last_access)方法会将Devise会话超时与上次请求时间/日期进行比较。

作为旁注,如果最后一个last_request_at值大于一分钟(或您选择的任何时间间隔),您可能只想更新last_request_at。否则,如果您的页面通过AJAX进行了大量的控制器调用,那么在一个请求中会有很多不必要的数据库更新。

答案 1 :(得分:4)

您是否正在尝试跟踪用户是否已登录并且会话处于活动状态,或者用户是否正在该网站上?

为了跟踪用户是否已登录,您需要在每次页面加载时向Warden添加回调并更新时间戳,然后如果他们没有做任何超过X时间段的任何事情,则认为他们已登录出。你可以这样做:

Warden::Manager.after_authentication do |user, auth, opts|
    if user.last_action <= 5.minutes.ago.utc
        user.last_action = Time.now
        user.save
    end
end

如果您想查看是否有活跃的季节并且没有明确注销,那么它将是:

Warden::Manager.before_logout do |user, auth, opts|
    user.current_sign_in_at = nil
    user.save
end

答案 2 :(得分:1)

为您的用户(设计)模型添加活动标记。在after_sign_in_path_for(resource)挂钩下的应用程序控制器中,将活动标志设置为true(当用户成功创建新会话时发生)。

对于loged out用户,覆盖devise session_controller中的destroy方法并将active标志设置为false,然后调用super。

现在你可以调用user.active吗?任何用户。

答案 3 :(得分:0)

Devise附带了一个方法current_user,它将返回控制器,模型和视图中的当前用户。