我试图通过在用户登录时将数据库字段设置为“1”,在用户注销时将数据库字段设置为“0”来创建在线用户列表。问题是 - 如果用户刚刚离开网站,“1”仍然保留在数据库中,所以我想要做的是在 session 过期时更新它。
登录:
def create
user = User.find_by_username(params[:username])
if user && user.authenticate(params[:password])
session[:user_id] = user.id
session[:username] = user.username
remote_ip = request.remote_ip
user.update_attributes(:online => 1, :ip => remote_ip)
redirect_to root_url
else
render "new"
end
end
以及注销:
def destroy
@user = User.where(:id => session[:user_id])
@user.each do |u|
u.update_attributes(:online => 0)
end
session[:user_id] = nil
session[:username] = nil
redirect_to root_url
end
有人可以建议我该怎么做吗?
最佳答案
您不能这样做,因为无法保证您的 destroy
操作将被调用。如果用户失去互联网连接怎么办?或者浏览器崩溃了?或者用户周末 AFK 了?
解决方案是在 user
模型上添加时间戳,例如 last_seen_at
,并在用户在您的网站上执行操作时更新该时间戳,例如使用 before_filter
:
class ApplicationController < ActionController::Base
before_filter :record_last_seen_at # TODO: Implement that method
end
然后,如果您想列出所有在线用户,请列出最后 5 分钟内所有活跃的用户,即您考虑在线的用户。
User.where(['last_seen_at > ?', 5.mines.ago])
您还可以使用现有的身份验证框架,例如 Authlogic 例如,您可以免费获得该功能。
关于ruby-on-rails - 更新 session 超时 rails 上的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901325/