Ruby on rails 当条件为false时,Ruby if conditional古怪地运行一些代码

Ruby on rails 当条件为false时,Ruby if conditional古怪地运行一些代码,ruby-on-rails,ruby,ruby-on-rails-3,devise,Ruby On Rails,Ruby,Ruby On Rails 3,Devise,我有一个设置,其中我有design被用作Rails应用程序的主身份验证处理程序,有时它似乎会拉出一个ActiveRecord关系而不是一个记录,这与调用Type的方式相同。例如,where(name:“bob”) 为了解决这个问题(我没有花太多的时间在Desive上,也没有太多的空闲时间来探索它),我只想确保我的登录检查并更正这个问题,所以我写了一个类似这样的部分: def authenticate_user_with_assignment! authenticate_user!

我有一个设置,其中我有
design
被用作Rails应用程序的主身份验证处理程序,有时它似乎会拉出一个ActiveRecord关系而不是一个记录,这与调用
Type的方式相同。例如,where(name:“bob”)

为了解决这个问题(我没有花太多的时间在Desive上,也没有太多的空闲时间来探索它),我只想确保我的登录检查并更正这个问题,所以我写了一个类似这样的部分:

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
我得到如下输出:

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
因此,它似乎忽略了我的
if
条件中的
logger
语句,而是运行赋值。我搞不懂为什么会发生这种事——有什么想法吗

current_user = current_user.first
这将创建一个局部变量,该变量对当前用户方法进行阴影处理。无论赋值是否实际执行,只要解析器注意到局部变量被声明,就会创建它们,因此如果
if
条件为false,则局部变量
当前用户
被声明,并且
为nil
。您需要执行
current\u user=
方法:

self.current_user = current_user.first

如果您没有这样的方法,请定义它。

您如何获得当前用户的价值?太棒了!这确实是解决办法。非常感谢。