undefined方法`id'表示false:FalseClass

Ada*_*ner 2 ruby ruby-on-rails

error(undefined method 'id' for false:FalseClass)引用了这一行:

if current_user && current_user.admin? || current_user.id == id.to_i
Run Code Online (Sandbox Code Playgroud)

为什么这会产生错误?current_user.id如果第一个&&条件失败,它不应该达不到?

use*_*740 7

表达方式

current_user && current_user.admin? || current_user.id == id.to_i
Run Code Online (Sandbox Code Playgroud)

解析如下

(current_user && current_user.admin?) || (current_user.id == id.to_i)
Run Code Online (Sandbox Code Playgroud)

因此,当current_user为false时,评估就像是

(false && current_user.admin?) || ?
(false)                        || ?
                                  (false.id == id.to_i)
                               # \\ KABOOM! //
Run Code Online (Sandbox Code Playgroud)

它应该用括号表示如下,其中只有当current_user不是false/nil时才调用方法.

current_user && (current_user.admin? || current_user.id == id.to_i)
Run Code Online (Sandbox Code Playgroud)

或者,考虑使用if封装逻辑的其他流控制结构和/或离散方法.


同样奇怪的是,current_user可以是false:nil当"没有当前用户"时可能更合适.

  • 您应该在答案中建议正确的方法,即"A &&(B || C)" (2认同)