Ruby on rails 在条件中指定的变量在同一条件中使用,抛出错误

Ruby on rails 在条件中指定的变量在同一条件中使用,抛出错误,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试这样做: if user = User.find_by(email: 'example@example.com') && !user.activated? # do something end 但是我遇到一个错误,说“没有为nil:NilClass“激活”任何方法” 我有没有办法不使用嵌套条件来完成此功能?没有,您不能在同一行中分配和使用相同的var,您需要将其分解 user = User.find_by(email: 'example@example.com

我正在尝试这样做:

if user = User.find_by(email: 'example@example.com') && !user.activated?
    # do something
end
但是我遇到一个错误,说“没有为nil:NilClass“激活”任何方法”


我有没有办法不使用嵌套条件来完成此功能?

没有,您不能在同一行中分配和使用相同的var,您需要将其分解

user = User.find_by(email: 'example@example.com')

if user && !user.activated?
    # do something
end

让我知道这是否有帮助。您可以检查user.nil吗?但上述方法也同样有效

不,您不能在同一行中分配和使用相同的var,您需要将其分解

user = User.find_by(email: 'example@example.com')

if user && !user.activated?
    # do something
end

让我知道这是否有帮助。您可以检查user.nil吗?但上述方法也同样有效

当找不到用户时,情况就是这样。您应该在条件中添加异常处理:

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

当找不到用户时就是这种情况。您应该在条件中添加异常处理:

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

您可以在逻辑运算符
&&
上使用控制流运算符
,如下所示:

  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"
这是因为
的先例低于赋值,因此赋值将在第二个条件检查之前发生

只要您不介意条件中的
found=,就应该是==
警告

第二选项:

if a = 12 && a.even? 
  "Working"
end 
#=> undefined method `even?' for nil:NilClass
if b = 12 and b.even? 
  "Working"
end 
#=> "Working"
另一个选项是显式括号,即

if a = 12 && a.even? 
  "Working"
end 
#=> undefined method `even?' for nil:NilClass
if (b = 12) && b.even? 
  "Working"
end 
#=> "Working"
这是因为括号
()
将在条件求值之前先求值,因此赋值将发生在括号内,然后作为条件的一部分求值


您可以在逻辑运算符
&
上使用控制流运算符
,如下所示:

  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"
这是因为
的先例低于赋值,因此赋值将在第二个条件检查之前发生

只要您不介意条件中的
found=,就应该是==
警告

第二选项:

if a = 12 && a.even? 
  "Working"
end 
#=> undefined method `even?' for nil:NilClass
if b = 12 and b.even? 
  "Working"
end 
#=> "Working"
另一个选项是显式括号,即

if a = 12 && a.even? 
  "Working"
end 
#=> undefined method `even?' for nil:NilClass
if (b = 12) && b.even? 
  "Working"
end 
#=> "Working"
这是因为括号
()
将在条件求值之前先求值,因此赋值将发生在括号内,然后作为条件的一部分求值


您确定这正是您的代码的样子吗?我相信这应该是可行的,因为如果找不到用户,那么它将返回nil,这将计算为false。你确定这就是你的代码的样子吗?我认为这应该是可行的,因为如果找不到用户,那么它将返回nil,这将计算为false。声明上面的变量并使用该引用save memory2.2.0:001>put“opopo”if user=“xxx”&&!user.nil?=>nil 2.2.0:002>如果user=“xxx”和!user.nil?(irb):2:warning:found=in conditional,should be==opopo=>nil根据irb:PNot在您的条件中声明变量的良好实践,这不是推荐的方法,如果您可以查看手册。(irb):2:warning:found=in conditional,因为您可以看到rest,您可以做任何您喜欢的事情。声明上面的变量并使用该引用save memory2.2.0:001>put“opopo”if user=“xxx”&&!user.nil?=>nil 2.2.0:002>如果user=“xxx”和!user.nil?(irb):2:warning:found=in conditional,should be==opopo=>nil根据irb:PNot在您的条件中声明变量的良好实践,这不是推荐的方法,如果您可以查看手册。(irb):2:warning:found=in conditional正如您看到的rest一样,您可以做任何您喜欢的事情。这将不会起作用,因为
NilClass
将不具有激活的方法,并且在第二次条件检查之前不会发生赋值。它只会在执行find之后出现在语句的第二部分query first2.2.0:001>执行find query first2.2.0:001>后,它将返回语句的第二部分,因为它将始终为false,因为
NilClass
将不具有激活的方法,并且在第二次条件检查之前不会发生赋值操作。如果user=“xxx”&&&,它将只返回语句的第二部分!user.nil?=>nil 2.2.0:002>如果user=“xxx”和!user.nil?(irb):2:warning:found=in conditional,应该是==opopo=>nil根据irb关注点,这不是推荐的方式。剩下的你可以做任何你喜欢做的事,老板。@MuaazRafi我很清楚,但是这个问题被问到了,这是正确的答案。有时,即使出现警告,控制流也有意义,例如,如果user=user,则类似于
send\u email\u message.find\u by(conditions)和user.email\u opt\u in?
这将起作用,并且仅在用户选择的情况下发送电子邮件。2.2.0:001>如果user=“xxx”&,则放置“opopo”!user.nil?=>nil 2.2.0:002>如果user=“xxx”和!user.nil?(irb):2:warning:found=in conditional,应该是==opopo=>nil根据irb关注点,这不是推荐的方式。剩下的你可以做任何你喜欢做的事,老板。@MuaazRafi我很清楚,但是这个问题被问到了,这是正确的答案。有时,即使出现警告,控制流也是有意义的,例如,如果user=user,则类似于
send\u email\u message.find\u by(conditions)和user.email\u opt\u in?
这将起作用,并且仅当用户选择加入时才会发送电子邮件。