我正在尝试找到一种在Web应用程序上显示已登录活动用户的方法。我没有像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
答案 0 :(得分:3)
这取决于您“当前在网站上”的意思。
如果要标记当前登录的用户,则像您描述的那样添加currently_logged_in
列是可行的。但是,这几天大多数用户在离开网站时都不会注销,因此可能不会执行您所要执行的操作想要。
更好的解决方案是添加一个last_active_at
列,每当用户执行某些操作时,您都可以使用当前时间对其进行更新。然后确定一个对您的网站有意义的阈值(假设为15分钟),并仅标记列表中过去15分钟之内last_active_at
值的用户。
假设您网站的“活动用户”定义涉及击中经过身份验证的端点,就像将身份验证方法更改为:
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
答案 1 :(得分:0)
首先,您需要在网站上找到当前用户。
您可以b调用应用程序帮助程序中的current_user
方法,并应在所需的任何位置显示所有当前用户。
例如,
module ApplicationHelper
def current_user
@current_user ||= session[:user_id] && User.find_by_id(session[:user_id])
end
end
然后您在会话控制器中将此方法称为@current_user
。