Rails和Authlogic。显示当前登录的用户

时间:2011-02-18 09:41:40

标签: ruby-on-rails

我想拥有当前登录用户的列表。

此代码不起作用:

<% UserSession.all.each do |user_session| %>

<% end %>

5 个答案:

答案 0 :(得分:5)

@ syed-aslam有一个很好的解决方案,但你可以让Authlogic完成这项工作。查看定义两个范围的模块Authlogic::ActsAsAuthentic::LoggedInStatuslogged_inlogged_out

您的代码变为:

<% User.logged_in.each do |user| %>

<% end %>

P.S。我通常会链接到the RDoc而不是源代码,但RDoc目前似乎有问题。

答案 1 :(得分:4)

Authlogic为您提供了您不需要自己更新或维护的所有类型的自动列,它们由Authlogic本身的实际代码流维护。 这些字段可以包含一些基本的功能相关问题,例如登录尝试次数,尝试的IP地址,甚至是用户上次登录时的IP地址。有趣。

帮助我们找到可能在线人员的神奇专栏是名为last_request_on的专栏,它基本上表明用户最后一次向您的应用程序发出请求的时间。

为了做出更准确的选择,我们需要的第二个参数是名为logged_in_timeout的配置选项,它设置过期后过期的超时,默认情况下它将在10分钟后过期。

因此,如果您将会话到期时间设置为30分钟:

class User << ActiveRecord::Base
  acts_as_authentic do |c|
    c.logged_in_timeout 30.minutes
  end
end

搜索这些用户非常简单:

module OnlineUsers
  def count_online_users
    User.count(:conditions => ["last_request_at > ?", 30.minutes.ago])
  end
end

答案 2 :(得分:1)

为什么不在用户模型中创建一个名为currently_active的字段,并在创建会话后将其更新为true,并在会话销毁后更新为false。

然后,您可以致电User.where(currently_active: true)为您提供在线用户。

答案 3 :(得分:0)

您无法为所有用户获取UserSession,每次用户发送请求时都会创建UserSession,并且不会在请求之间记住。

但是,您可以显示在某段时间内登录的用户(如果您在每次登录时更新了last_logged_in列)

Logged in last 15 minutes:
<% User.find("last_logged_in < ?", 15.minutes.ago ).each do |user| %>

答案 4 :(得分:-1)

我在UserSession模型中编写了after_create和before_destroy回调。 在after_create回调中,我写了用户登录到文本文件(self.user.id)的用户ID,在before_create回调中我删除了相同的用户ID。为了检查用户的活动,我阅读了文本文件并检查了该文件中是否存在用户ID。