Rails:臭名昭著的“ current_user”来自哪里?


94

我最近一直在浏览Rails,注意到其中有很多关于的引用current_user。这仅来自Devise吗?即使我使用Devise,也必须自己手动定义它吗?是否有使用先决条件current_user(例如会话,用户等的存在)?

Answers:


81

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

您需要将user_id存储在某个位置,通常在登录后在会话中。它还假定您的应用具有并且需要用户,身份验证等。

通常,它类似于:

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

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

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


会话是否类似于用于控制用户登录状态的常用控制器/模型?还是内置在导轨中?
bigpotato

session内置在Rails中。默认情况下,它使用cookie来维护请求之间的客户端状态。有关更多信息,请参见guides.rubyonrails.org/security.html#sessions
艾里克·彼得森

2
注意:如果您正在阅读此答案,请确保包括return unless session[:user_id]Zach答案中所示的内容-否则,if current_user注销时的每次检查都会触发另一个数据库查询。
DreadPirateShawn 2014年

10

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

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end

会话是否类似于用于控制用户登录状态的常用控制器/模型?还是内置在导轨中?
bigpotato 2012年

1
session有点像params,只是它对于多个请求仍然有效。您可以使用它来存储您的单个用户唯一的任何类型的持久性参数(直到他们的会话过期或他们注销)。您可以在此处了解更多信息:ActionController:访问会话
Zach Kemp 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.