指示当前登录的用户

时间:2018-12-25 00:12:59

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

我正在尝试找到一种在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

2 个答案:

答案 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