2017-12-01 8 views
2

나는 current_user 도우미와 함께 Devise를 사용하는이 응용 프로그램을 가지고 있습니다. 모듈을 만들 때 current_usernil이됩니다.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> 

다소 지연 평가와 관련이 있습니까?

편집

전체 문제는 문이 평가되지 않을 때 루비가 변수를 정의하는 방법에 의존 :

아래에이 작업을 수행하는 방법
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으로 설정됩니다. 이것이 귀하의 두 번째 putsnil 인 이유입니다. current_user = nilcurrent_user = :someone으로 변경하더라도 두 번째 puts은 여전히 ​​nil으로 표시됩니다.