Ruby条件奇怪地似乎在条件为假时运行某些代码

时间:2014-09-23 15:58:45

标签: ruby-on-rails ruby ruby-on-rails-3 devise

我有一个设置,我将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语句,但运行了赋值。我无法弄清楚为什么会这样 - 任何想法?

1 个答案:

答案 0 :(得分:2)

current_user = current_user.first

这会创建一个局部变量,它会隐藏current_user方法。一旦解析器注意到它们被声明,就会创建局部变量,无论赋值是否实际执行,因此如果if条件为假,则声明局部变量current_usernil。您需要执行current_user=方法:

self.current_user = current_user.first

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