복붙노트

[RUBY-ON-RAILS] 레일 3 'config.autoload_paths'에 lib 디렉토리를 추가하면 내 모듈을 자동로드하지 않습니다

RUBY-ON-RAILS

레일 3 'config.autoload_paths'에 lib 디렉토리를 추가하면 내 모듈을 자동로드하지 않습니다

나는 Rails.root / lib 폴더 옆에있는 파일 이름 g.rb를 배치 파일의 내용은 다음과 같이이다 :

module Google
end

그럼 추가

config.autoload_paths += %W(#{config.root}/lib #{Rails.root}/app/delayed_jobs)

내 Rails.root / 설정 / application.rb

나는 레일 콘솔에서 구글을 호출 할 때, 예외가 throw됩니다. 예외는 내가 '구글'이 필요 실행할 경우에만 사라집니다. 왜? 내 파일이 자동으로로드됩니다 안 나는 여분의 필요로 문없이 모듈에 액세스하지 않겠습니까?

해결법

  1. ==============================

    1.흠, 나는 흥미로운 점을 발견했다. 자동 부하 내 클래스에 레일 위해서는, 클래스 이름은 파일 이름과 폴더 구조를 준수해야한다. 내가 구글 모듈이 자동으로 적재 갖고 싶어 (I가에서 / lib에 자동로드를 지정 넣다) 예를 들어, 내가 바로 아래에 / lib에, google.rb 내부를 배치해야합니다. 나는 자동 부하 구글 :: 문서 도구 싶은 경우에, 나도 google.rb 내부에 배치 또는 / docs.rb 구글

    흠, 나는 흥미로운 점을 발견했다. 자동 부하 내 클래스에 레일 위해서는, 클래스 이름은 파일 이름과 폴더 구조를 준수해야한다. 내가 구글 모듈이 자동으로 적재 갖고 싶어 (I가에서 / lib에 자동로드를 지정 넣다) 예를 들어, 내가 바로 아래에 / lib에, google.rb 내부를 배치해야합니다. 나는 자동 부하 구글 :: 문서 도구 싶은 경우에, 나도 google.rb 내부에 배치 또는 / docs.rb 구글

  2. ==============================

    2.나는 Heroku가 실행되도록 내 모듈을 점점 비슷한 문제가 있었다. 스티븐 C에 의해 언급 된 자동로드 명명 규칙뿐만 아니라, 나는 모듈 코드 인해 스레드가 내 production.rb에서 주석에도 불구하고 Heroku가 (에 레일 '생산 환경에 의해 만들어진 스레드 가정에 require'd되어야한다는 것을 발견 구성 파일.) 최대한 빨리 호출하기 전에 모듈 파일을 require'd로 모듈에 포함이 모든 작업을 시작했다.

    나는 Heroku가 실행되도록 내 모듈을 점점 비슷한 문제가 있었다. 스티븐 C에 의해 언급 된 자동로드 명명 규칙뿐만 아니라, 나는 모듈 코드 인해 스레드가 내 production.rb에서 주석에도 불구하고 Heroku가 (에 레일 '생산 환경에 의해 만들어진 스레드 가정에 require'd되어야한다는 것을 발견 구성 파일.) 최대한 빨리 호출하기 전에 모듈 파일을 require'd로 모듈에 포함이 모든 작업을 시작했다.

    require 'mymodule'
    include Mymodule
    

    Heroku가 (생산)에서 제대로로드 모듈을 얻기의 주제에이 우수한 기사에서 봐 주시기 바랍니다.

  3. ==============================

    3.즉, 자동로드의 포인트는 '필요'모든 앞까지 (시작의 벌금)에 있지 않기 때문에의. 수업은 그들이 필요로 / 참조로드됩니다. 이를 위해, 당신은 클래스를 찾을 방법을 알고 할 수있는 방법이 필요합니다. 그렇지 않으면, 당신은 클래스 선언을 확인하려면 사전에 자동로드 디렉토리에있는 모든 파일을로드해야합니다. 그것은 트레이드 오프,하지만 (marbaq에서 알 수 있듯이) 사전에 모든 것을 요구하는 것은 자동 로딩되지 않습니다. 두 개의 인수, (즉, 상징 : 귀하의 경우 구글) 부하 모듈을 취 루비에 의해 제공과 같은 경우에 자동로드 명령을 사용할 수 있으며, 두 번째 인수는 lib 디렉토리에있는 경우 g.rb 될 파일 이름, 당신의 부하 경로 ($ :). 자동로드의 루비 문서를 참조하십시오.

    즉, 자동로드의 포인트는 '필요'모든 앞까지 (시작의 벌금)에 있지 않기 때문에의. 수업은 그들이 필요로 / 참조로드됩니다. 이를 위해, 당신은 클래스를 찾을 방법을 알고 할 수있는 방법이 필요합니다. 그렇지 않으면, 당신은 클래스 선언을 확인하려면 사전에 자동로드 디렉토리에있는 모든 파일을로드해야합니다. 그것은 트레이드 오프,하지만 (marbaq에서 알 수 있듯이) 사전에 모든 것을 요구하는 것은 자동 로딩되지 않습니다. 두 개의 인수, (즉, 상징 : 귀하의 경우 구글) 부하 모듈을 취 루비에 의해 제공과 같은 경우에 자동로드 명령을 사용할 수 있으며, 두 번째 인수는 lib 디렉토리에있는 경우 g.rb 될 파일 이름, 당신의 부하 경로 ($ :). 자동로드의 루비 문서를 참조하십시오.

  4. ==============================

    4.config.eager_load_paths로 변경 config.autoload_paths

    config.eager_load_paths로 변경 config.autoload_paths

    (레일에 따라 레일의 lib 디렉토리 3.2 콘솔에서 # 6850와 강제로 다시로드! 발행)

  5. ==============================

    5.난 그냥 지금 같은 문제에 직면하고 (또는 오히려 해결 방법) 내 "솔루션"수동으로 application.rb에 Rails.root / lib 디렉토리에서 모든 필요한 파일이 필요했다.

    난 그냥 지금 같은 문제에 직면하고 (또는 오히려 해결 방법) 내 "솔루션"수동으로 application.rb에 Rails.root / lib 디렉토리에서 모든 필요한 파일이 필요했다.

    require 'lib/message'
    require 'lib/store'
    require 'lib/vault/vault.rb'
    require 'lib/custom_loggers'
    
    module MyApplication
      class Application < Rails::Application
    

    내 다음 단계는 당신이 언급으로 모듈 폴더에있는 파일을 분류하는 것입니다.

  6. ==============================

    6.나는 최근에이 솔루션을 발견

    나는 최근에이 솔루션을 발견

    설정 / application.rb

    module AppName
      class Application < Rails::Application
    
        # Custom directories with classes and modules you want to be autoloadable.
        config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]
        config.autoload_paths += Dir[Rails.root.join('app', 'lib', 'extensions')] 
    
      end
    end
    

    처음 설정 통화를 유도 자동 부하에 응용 프로그램 / 모델 디렉토리의 모든 하위 디렉토리를 레일 그래서 지금은-자동로드 /app/models/sub_directory/model.rb을 가질 수 있습니다 (편리한 큰 코드베이스와 응용 프로그램을 구성하는)

    두 번째 설정 통화를 유도는 LIB / 확장 디렉토리를 자동로드하는 레일

    도움이 되었기를 바랍니다

    참고 :이 믿는다는 3 특정 레일

  7. from https://stackoverflow.com/questions/4074830/adding-lib-to-config-autoload-paths-in-rails-3-does-not-autoload-my-module by cc-by-sa and MIT license