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 >
これは下でどのように機能しますか?