Ruby on rails 3.1 如何判断给定的Desive用户是否已立即登录?

Ruby on rails 3.1 如何判断给定的Desive用户是否已立即登录?,ruby-on-rails-3.1,devise,Ruby On Rails 3.1,Devise,在使用Desive的Rails应用程序中,是否有一种方法可以判断特定的用户现在是否已登录 我知道视图帮助程序,用户\u登录?。我要找的更像: User.all.each do |user| puts user.signed_in? end 我看到Deviate在用户栏中添加了一个当前登录。但是当用户注销时,它没有被设置为NULL,所以我不能用它进行测试 如何检查用户当前是否已登录?您是否正在尝试跟踪该用户是否已登录且会话处于活动状态,或者该用户是否正在站点上 为了跟踪用户是否登录,您需要向

在使用Desive的Rails应用程序中,是否有一种方法可以判断特定的用户现在是否已登录

我知道视图帮助程序,
用户\u登录?
。我要找的更像:

User.all.each do |user|
  puts user.signed_in?
end
我看到Deviate在
用户
栏中添加了一个
当前登录。但是当用户注销时,它没有被设置为
NULL
,所以我不能用它进行测试


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

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

为了跟踪用户是否登录,您需要向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

Deviate提供了一种方法
current\u user
,该方法将在控制器、模型和视图中返回当前用户。

您可以在应用程序控制器中添加一个before\u filter,以在用户表中的last\u request\u at字段中设置当前日期/时间,您必须首先通过迁移添加该字段。当然,在从before_过滤器调用的方法中,您需要确保首先对用户进行身份验证。您可能希望为不需要身份验证的操作删除筛选器

然后,假设您在用户模型中包含了Timeoutable模块,您可以通过如下方式调用来查看用户的会话是否为当前会话:

user.timedout?(user.last_request_at)
超时模块中定义的timedout?(上次访问)方法将比较设备会话超时与上次请求时间/日期


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

为您的用户(设计)模型添加活动标志。在应用程序控制器中的
after\u sign\u In\u path\u for(resource)
hook下,将活动标志设置为true(当用户成功创建新会话时发生)

对于注销用户,覆盖Desive session_控制器中的destroy方法,并将活动标志设置为false,然后调用super


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

您知道如果用户自动注销,是否会运行注销前的
块,如Devise的
超时
?每当使用管理员
注销
方法清理会话时,就会运行该块。特别是对于
timedoutable
它肯定会运行。我想你误解了我的问题<代码>当前用户
的作用域可以说是一个会话;如果现在有5个人登录到我的网站,所有人都在看同一个页面,该页面显示当前用户的值,他们每个人都会看到自己。我想要的是一种方式,作为一个网站管理员,列出所有5个登录用户,或者问“是吗?”someuser@example.com“是否立即登录?”可能是的副本,但这两个问题的答案都很有道理。不确定我最初的想法。HTTP是无状态的。是否有人“现在”登录是一个毫无意义的问题,除非他们目前正在提出请求。我们能得到的最接近的是“对于哪些用户,我们在数据库中的会话不比X更大,这样,如果他们现在用相应的Cookie提出请求,我们会认为它有效吗?”大多数答案都与用户是否在最后x分钟内提出了请求有关。我不知道如何查看会话(存储在cookies中),所以我使用了的修改版本,基本上是在每个请求上更新User.last_request_字段(除了我将更新限制为每分钟一次)。
user.timedout?(user.last_request_at)