2017-12-01 20 views
2

私はcurrent_userヘルパーでDeviseを使用するこのアプリケーションを持っています。私がモジュールを作成すると、current_userは決して起こらないのにそれに帰属すると言いますとnilになります。Rails ActiveSupport ::問題と方法の評価

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> 

これはやや怠惰な評価に関係するでしょうか?文が評価されていない場合

EDIT

は全体の問題は、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 > 

の下に、このしくみを教えてください。

答えて

2
  1. current_userが考案ではなく、ローカル変数によって提供されるヘルパー方法あります。

  2. このようなヘルパーメソッドcurrent_user=はありません。 current_user = nilself.current_user = nilに変更してクラッシュすることでこれを証明できます。しかし、これはあなたの問題には関係ありません。

だから、結果は同じ名前のヘルパーメソッドをシャドウ2 puts間のローカル変数current_userを、定義されています。

if falseのためにcurrent_user = nilは実行されませんが、ローカル変数はまだ定義されており、その値は暗黙的にnilに設定されています。このため、あなたの2番目のputsnilと表示されます。 current_user = nilcurrent_user = :someoneに変更しても、2番目のputsはまだnilと表示されます。

関連する問題