ruby-on-rails - 指示当前登录的用户
问题描述
我正在尝试找到一种方法来在我的网络应用程序上显示登录的活动用户。我没有使用任何像 Devise 这样的 gem 进行身份验证。我有一个用户列表,如果用户当前在网站上,我想在用户名旁边显示一个图标或某种类型的指示器。
我不知道该怎么做。可能我可以添加一个名为currently_logged_in
我的User
模型的列,并可以将值设置true
为创建会话的时间,然后设置false
销毁用户会话的时间?
class SessionsController < ApplicationController
def new
end
def create
if user = User.authenticate(params[:email], params[:password])
session[:user_id] = user.id #session id created off of the
redirect_to(session[:intended_url] || user)
session[:intended_url] = nil #removes url from the sessions
else
flash.now[:error] = "Invalid email/password combination"
render :new
end
end
def destroy
session[:user_id] = nil
redirect_to root_url
end
end
用户模型
# tries to find an existing user in the database so that they can be authenticated.
def self.authenticate(email, password)
user = User.find_by(email: email) # returns user or nil value
user && user.authenticate(password) # if user exists validate that password is correct
end
解决方案
这取决于您所说的“当前在网站上”是什么意思。
如果您想标记当前已登录的用户,则添加currently_logged_in
您所描述的列有效。但是,如今大多数用户在离开网站时都不会注销,因此可能不会做您想做的事情。
更好的解决方案是添加一个last_active_at
列,您可以在用户执行某些操作时使用当前时间更新该列。然后确定一个对您的网站有意义的阈值,例如 15 分钟,并且仅在您的列表中标记last_active_at
过去值小于 15 分钟的用户。
假设您网站的“活动用户”定义涉及到经过身份验证的端点,那么只需将您的身份验证方法更改为:
def self.authenticate(email, password)
user = User.find_by(email: email) # returns user or nil value
if user && user.authenticate(password)
user.update!(last_active_at: Time.now)
true
else
false
end
end
推荐阅读
- python - QtDesigner Pyqt / Pyside 默认禁用可翻译
- ios - 在 Swift 中将完成处理程序分配给闭包变量
- go - 如何通过 client-go 和 golang 检索 kubernetes 指标
- spring - Spring&Hibernate 分页
- xamarin - 通过 Urhosharp 在球体上添加纹理
- php - .htaccess :默认加载目录
- git - git flow 澄清 - 变基比合并好吗?请解释
- javascript - 如何在所有后代文本节点(Javascript)中搜索值?
- c++ - constness 它不会为依赖类型传播
- sql - 如何获取带有 ORDER BY 的 postgres 查询以进行仅索引扫描?