[英]indicate which users are currently logged in
我正试图找到一种方法来显示我的网络应用程序上登录的活跃用户。 我没有像Devise那样使用任何宝石进行身份验证。 我有一个用户列表,并希望在用户名称旁边显示一个图标或某种类型的指标,如果他们当前在网站上。
我不知道该如何解决这个问题。 也许我可以添加一个名为列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
首先,您需要在现场找到当前用户。 您可以调用应用程序帮助程序中的current_user
方法,并且应该在所需的任何位置显示所有当前用户。 例如,
module ApplicationHelper
def current_user
@current_user ||= session[:user_id] && User.find_by_id(session[:user_id])
end
end
并在Session控制器中将此方法称为@current_user
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.