我有这个应用程序使用带有current_user
帮助器的Devise。当我创建模块时,current_user
在我提及其归属后变为nil
,即使它从未发生过。
class PagesController < ApplicationController
include ModuleTest
def index
a_test_method
end
end
ModuleTest :
module ModuleTest
extend ActiveSupport::Concern
def a_test_method
puts "(BEFORE)===========> #{current_user.inspect}"
current_user = nil if false
puts "(AFTER) ===========> #{current_user.inspect}"
end
end
输出:
(BEFORE)===========> #<User id: 1>
(AFTER) ===========> nil
但,如果我删除/注释掉此行# current_user = nil if false
,则current_user
仍然有效:
(BEFORE)===========> #<User id: 1>
(AFTER) ===========> #<User id: 1>
这有点与懒惰的评价有关吗?
修改
整个问题依赖于Ruby在未评估语句时如何定义变量:
2.3.4 (main):0 > defined? this_never_seen_variable_before
=> nil
2.3.4 (main):0 > this_never_seen_variable_before = "value" if false
=> nil
2.3.4 (main):0 > defined? this_never_seen_variable_before
=> "local-variable"
2.3.4 (main):0 >
2.3.4 (main):0 > this_never_seen_variable_before_2
NameError: undefined local variable or method `this_never_seen_variable_before_2' for main:Object
from (pry):119:in `<main>'
2.3.4 (main):0 > this_never_seen_variable_before_2 = "value" if false
=> nil
2.3.4 (main):0 > this_never_seen_variable_before_2
=> nil
2.3.4 (main):0 >
这是如何在下面工作的?
答案 0 :(得分:2)
Field to check: Request Header
Reference Name: var
Regular Expression: X-User-Id: (\w+.)
Template: $1$
Match No: 1
是由Devise提供的帮助方法,而不是本地变量。
没有名为current_user
的辅助方法。您可以通过将current_user=
更改为current_user = nil
并看到它崩溃来证明这一点。但这与您的问题无关。
结果是,您在2 self.current_user = nil
之间定义了一个局部变量current_user
,它使用相同的名称隐藏了辅助方法。
奇怪的是,虽然由于puts
而未执行current_user = nil
,但仍然定义了局部变量,并且其值隐式设置为if false
。这就是您的第二个nil
显示puts
的原因。即使您将nil
更改为current_user = nil
,您的第二个current_user = :someone
仍应显示puts
。