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
如果您没有这样的方法,请定义它。您如何获得当前用户的价值?太棒了!这确实是解决办法。非常感谢。