我试图做这样的事情:
if user = User.find_by(email: 'example@example.com') && !user.activated?
# do something
end
但我收到一个错误,说#34;没有方法'已激活'为零:NilClass"
有没有办法让我在不使用嵌套条件的情况下完成此功能?
答案 0 :(得分:2)
您可以在逻辑运算符and
上使用控制流运算符&&
,如下所示:
if user = User.find_by(email: 'example@example.com') and !user.activated?
# do something
end
示例:强>
if a = 12 && a.even?
"Working"
end
#=> undefined method `even?' for nil:NilClass
if b = 12 and b.even?
"Working"
end
#=> "Working"
这是有效的,因为and
的先例低于赋值,因此赋值将在第二次条件检查之前发生。
只要您不介意found = in conditional, should be ==
警告。
第二个选项:
你的另一个选择是明确的括号,即
if a = 12 && a.even?
"Working"
end
#=> undefined method `even?' for nil:NilClass
if (b = 12) && b.even?
"Working"
end
#=> "Working"
这是有效的,因为在计算条件之前将首先计算括号()
,因此赋值将在parens中发生,然后作为条件的一部分进行求值。
答案 1 :(得分:0)
不,你不能在同一行中分配和使用相同的var,你需要将其分解。
user = User.find_by(email: 'example@example.com')
if user && !user.activated?
# do something
end
如果这有帮助,请告诉我。你可以检查user.nil?但上面也会奏效。
答案 2 :(得分:0)
就是找不到用户的情况。您应该在条件中添加异常处理:
if user = User.find_by(email: 'example@example.com') && !user.try(:activated)?
# do something
end