Rails:臭名昭着的"current_user"来自哪里?

big*_*ato 90 ruby-on-rails

我最近一直在环顾Rails并注意到有很多引用current_user.这只来自Devise吗?即使我使用Devise,我是否必须自己手动定义?是否有使用的先决条件current_user(如会话,用户等的存在)?

Eri*_*son 79

它由几个宝石定义,例如Devise

您需要将user_id存储在某处,通常是在登录后的会话中.它还假设您的应用程序具有并且需要用户,身份验证等.

通常,它是这样的:

class ApplicationController < ActionController::Base
  def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
  end
end
Run Code Online (Sandbox Code Playgroud)

这假设User类存在,例如#{Rails.root}/app/models/user.rb.

更新:在没有当前用户时避免其他数据库查询.

  • 注意:如果你正在阅读这个答案,一定要包括`return除非会话[:user_id]`,如Zach的回答所示 - 没有这个,在注销时每个`if current_user`检查都会触发另一个数据库查询. (2认同)

Zac*_*emp 10

是的,current_user使用session.如果要滚动自己的身份验证,可以在应用程序控制器中执行类似操作:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end
Run Code Online (Sandbox Code Playgroud)