【发布时间】:2017-12-01 05:19:41
【问题描述】:
我有这个应用程序,它使用带有current_user 助手的设计。当我创建一个模块时,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 >
这在下面是如何工作的?
【问题讨论】:
标签: ruby-on-rails ruby devise activesupport-concern