我想拥有当前登录用户的列表。
此代码不起作用:
<% UserSession.all.each do |user_session| %>
<% end %>
答案 0 :(得分:5)
@ syed-aslam有一个很好的解决方案,但你可以让Authlogic完成这项工作。查看定义两个范围的模块Authlogic::ActsAsAuthentic::LoggedInStatus:logged_in
,logged_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。