我有一个设置,我将Devise
用作Rails应用程序的主要身份验证处理程序,偶尔它会以同样的方式提取ActiveRecord Relation而不是记录例如,如果您拨打Type.where( name: "bob" )
,则可能会这样做。
为了解决这个问题(我没有花很多时间和Devise一起度过,而且我没有多少时间去探索它)我只是想确保我的签到并且纠正了这个,所以我写了一个这样的部分:
def authenticate_user_with_assignment!
authenticate_user!
logger.debug("User is #{current_user.inspect}")
if ( current_user.is_a?(ActiveRecord::Relation) )
logger.debug ("It is a relation!")
current_user = current_user.first
else
logger.debug ("Not a relation.")
end
logger.debug("User is #{current_user.inspect}")
# do some other stuff
end
我得到这样的输出:
User is #<User id: 1, email: "admin@testaddress.com" ... etc >
Not a relation.
User is nil
如果我注释掉current_user = current_user.first
行,我就明白了:
User is #<User id: 1, email: "admin@testaddress.com" ... etc >
Not a relation.
User is #<User id: 1, email: "admin@testaddress.com" ... etc >
所以它似乎忽略了我logger
条件中的if
语句,但运行了赋值。我无法弄清楚为什么会这样 - 任何想法?
答案 0 :(得分:2)
current_user = current_user.first
这会创建一个局部变量,它会隐藏current_user
方法。一旦解析器注意到它们被声明,就会创建局部变量,无论赋值是否实际执行,因此如果if
条件为假,则声明局部变量current_user
并nil
。您需要执行current_user=
方法:
self.current_user = current_user.first
如果您没有这样的方法,请定义它。