2009-12-14 2 views
2

레일즈에서 이니셜 라이저/환경 .rb 웹 응용 프로그램 자체가로드되고 있는지 (스크립트/서버) 결정하는 방법은 무엇입니까?스크립트/서버 시작 여부 결정

모든 초기화 프로그램은 스크립트/콘솔 및 기타 레일 작업 마이그레이션을 위해로드되지만 제 경우에는 서버 자체를 초기화 할 때 일부 항목 만로드하면됩니다.

내 아이디어 : 검사 $ 0

감사합니다! Reto

답변

3

각각 고유 한 초기화 전략을 가진 응용 프로그램 서버가 여러 개 있기 때문에 서버 부팅 프로세스에 안정적으로 연결할 수있는 유일한 방법을 권장합니다 : ActionController :: Dispatcher.

Dispatcher에는 몇 가지 콜백이 있습니다. 즉 :

  • prepare_dispatch
  • before_dispatch
  • after_dispatch

는 "준비"콜백 개발 모드에서 모든 요청하기 전에 실행하고있다 (to_prepare에 추가) 생산 모드에서 첫 번째 요청하기 전에 . 에 관계없이 우리는 서버 부팅하는 경우의

Rails::Initializer.run do |config| 
    config.to_prepare do 
    # do your special initialization stuff 
    end 
end 

불행하게도, 내 지식이 콜백은 항상 실행됩니다 초기화가 Dispatcher.run_prepare_callbacks를 호출 레일 이후 : 레일 구성 객체는 자신의 to_prepare 방법을 통해 이러한 콜백을 추가 할 수 있습니다 또는 스크립트/콘솔 또는 레이크 작업에 적용 할 수 있습니다. 당신은이 문제를 방지하려면, 그래서 당신은 당신의 environment.rb에이를 시도 할 수 있습니다 :

Rails::Initializer.run do |config| 
    # your normal stuff 
end 

if defined? ActionController::Dispatcher 
    ActionController::Dispatcher.to_prepare do 
    # your special stuff 
    end 
end 

지금, 당신의 "특별한 물건"단지 생산 모드에서 첫 번째 요청하기 전에 실행하지만, 개발에 전에 모든 요청. 여분의 라이브러리를로드하는 경우 문을 load 또는 require에 두 번 붙여 넣기를하지 않을 수 있습니다. require 메서드는 단일 파일을 두 번로드하지 않지만 주위에 경비원을 배치하는 것이 좋습니다.

+0

감사합니다. 발송자를 확인하는 것은 매우 좋은 아이디어처럼 들립니다. 그러나 나는 (시작시) 한 번만 몇 가지 일을해야하기 때문에 'to_prepare'에 연결하지 않을 것이다. 그러나 개념은 동일하게 유지됩니다! 그레이트 : D. – reto

+0

아아, 그렇지 않으면 ActionController :: Dispatcher가 정의됩니다. jruby를 사용하고 있다는 사실이 원인 일 수 있습니다. 던노. 나는 내가 지금 0 달러로 돌아갈 것이라고 생각한다. 어쨌든 고마워! – reto

+0

신경 쓰지 마세요! 그것은 완벽하게 작동, 어리석은 내가 배치 "박았"잘못된 위치에로드 된 파견;). 감사 – reto

0

아마이 방법을 사용하는 것이 더 좋을지 모르겠지만, 하나를 알지 못하기 때문에 스크립트/서버를 변경하여 환경 변수를 설정해야합니다.

그런 다음 환경 변수에 대한 이니셜 라이저 검사를 수행합니다.