繁体   English   中英

指示当前登录的用户

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM