在条件中分配的变量用于相同的条件,抛出错误

时间:2016-08-08 17:59:07

标签: ruby-on-rails ruby

我试图做这样的事情:

if user = User.find_by(email: 'example@example.com') && !user.activated?
    # do something
end

但我收到一个错误,说#34;没有方法'已激活'为零:NilClass"

有没有办法让我在不使用嵌套条件的情况下完成此功能?

3 个答案:

答案 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中发生,然后作为条件的一部分进行求值。

More on Ruby Operator Precedence

答案 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