2013-03-20 3 views
1

레일 3 초기화 프로세스를 수행하면서 Rails :: Engine (10 개가 있음)에 정의 된 모든 이니셜 라이저가 Rails :: Application 인스턴스에 두 번 이상 추가되었다는 것을 알았습니다. 즉, 이니셜 라이저가 여러 번 실행됩니다. 1. 레일 : 응용 프로그램 # 이니셜 라이저 : 다음은 분석입니다Rails :: Application에 Rails :: Engine에 정의 된 중복 이니셜 라이저가 여러 개있는 이유는 무엇입니까?

def initializers #:nodoc:   
    Bootstrap.initializers_for(self) + 
    super +       
    Finisher.initializers_for(self) 
end 

그것은 호출 슈퍼로 정의된다 (레일 :: 엔진) 방법은 다음과 같습니다

def initializers 
    initializers = [] 
    ordered_railties.each do |r| 
    if r == self 
     initializers += super 
    else 
     initializers += r.initializers 
    end        
    end 
    initializers 
end 

우리는 볼 수 있습니다 모든 엔진 (Rails :: Engine에서 상속받은 클래스)이 Rails :: Engine의 초기화 프로그램을 Rails :: Engine의 이니셜 라이저에 추가합니다. 하지만 다른 모든 엔진은 Rails :: Application의 ordered_railties에 포함되어 있으므로 이니셜 라이저도 Rails :: Application의 엔진에 추가됩니다. Rails :: Engine의 초기화 프로그램이 Rails :: Application에 여러 번 추가되었다고 결론 지을 수있다. 우리는 콘솔 정보에서 볼 수 있습니다

1.9.3p194 :002 > Rails.application.initializers.map(&:name).size 
=> 119 
1.9.3p194 :001 > Rails.application.initializers.map(&:name).uniq.size 
=> 79 

그래서 레일의 모든 초기화 :: 엔진은 레일의 5 배를 추가 :: 응용 프로그램. 왜 이런 일이 일어 났는지 궁금합니다. 특별한 이유가 있습니까?

답변

0

이니셜 라이저에는 name : context, block 등의 다른 여러 속성이 있습니다. 따라서 Rails :: Engine에서 엔진이 상속 될 때마다 모든 Rails :: Engine의 초기화 프로그램이 다른 컨텍스트로 하위 엔진에 추가됩니다. 즉, 동일한 이름을 가진 Rails :: Application에 중복 이니셜 라이저가 있지만 실제로는 서로 다른 컨텍스트에서 실행되는 이니셜 라이저가 다릅니다.

def run(*args)       
    @context.instance_exec(*args, &block) 
end