首页 > 解决方案 > 指示当前登录的用户

问题描述

我正在尝试找到一种方法来在我的网络应用程序上显示登录的活动用户。我没有使用任何像 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

标签: ruby-on-railsruby-on-rails-5

解决方案


这取决于您所说的“当前在网站上”是什么意思。

如果您想标记当前已登录的用户,则添加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

推荐阅读