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/config/application.rb
그러나에서 Google을 호출하려고 rails console
하면 예외가 발생합니다. 내가 실행하는 경우에만 예외가 사라집니다 require 'google'
. 왜? 내 파일이 자동으로로드되지 않아야하고 추가 require
설명 없이 모듈에 액세스하면 안 됩니까?
흠, 흥미로운 것을 발견했습니다. Rails가 내 클래스를 자동으로로드하려면 클래스 이름이 파일 이름과 폴더 구조를 준수해야합니다. 예를 들어 Google 모듈을 자동으로로드하려면 google.rb
/ lib 바로 아래에 배치해야합니다 (/ lib에서 자동로드를 지정하는 경우). 자동로드하려면 Google::Docs
내부에 배치 google.rb
하거나google/docs.rb
내 모듈을 Heroku에서 실행하는 데 비슷한 문제가 발생했습니다. Stephen C가 언급 한 자동로드 명명 규칙에 추가하여, 모듈 코드는 Heroku의 Rails '프로덕션 환경에서 만든 가정으로 require
인해'd ' 여야한다는 것을 발견했습니다 threadsafe
( threadsafe
내 production.rb
구성 파일 에 주석 처리 되었지만 ). 내가 같이 require
'호출하기 전에 모듈 파일을 거라고 include
모듈에 모든 작업을 시작했다.
require 'mymodule'
include Mymodule
Heroku (프로덕션)에서 모듈을 올바르게로드하는 주제에 대한 이 훌륭한 기사 를 살펴보십시오 .
즉, 자동로드의 포인트이기 때문에의 하지 '필요'모든 앞까지 (시작의 벌금)에. 클래스는 필요 / 참조 될 때로드됩니다. 이렇게하려면 클래스를 찾을 위치를 알 수있는 방법이 필요합니다. 그렇지 않으면 어떤 클래스가 선언되었는지 미리보기 위해 autoload 디렉토리의 모든 파일을로드해야합니다. 트레이드 오프이지만 모든 것을 미리 요구하는 것은 (marbaq이 제안한대로) 자동 로딩이 아닙니다. Ruby에서 제공하는 autoload 명령을 사용할 수 있습니다. 두 개의 인수,로드 할 모듈 (기호화 됨, 예 : Google)을 사용하고 두 번째 인수는 파일 이름입니다. lib가있는 경우 g.rb가됩니다. 로드 경로 ($ :). 자동로드는 Ruby 문서를 참조하세요.
변경 config.autoload_paths
에config.eager_load_paths
( Rails 문제 # 6850 및 Rails 3.2 콘솔의 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
다음 단계는 언급했듯이 모듈 폴더의 파일을 분류하는 것입니다.
최근에이 해결책을 찾았습니다
config / 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 디렉토리의 모든 하위 디렉토리를 자동로드하도록 유도하므로 이제 /app/models/sub_directory/model.rb를 자동로드 할 수 있습니다 (대규모 코드 기반으로 앱을 구성하는 데 편리함).
두 번째 구성 호출은 레일이 lib / extensions 디렉토리를 자동로드하도록 유도합니다.
도움이 되었기를 바랍니다
참고 : 이것이 rails 3 특정이라고 생각합니다.
'Program Tip' 카테고리의 다른 글
해결 방법“문자열 보간은 선택적 값에 대한 디버그 설명을 생성합니다. (0) | 2020.10.23 |
---|---|
jQuery UI 슬라이더 (프로그래밍 방식으로 설정) (0) | 2020.10.23 |
C #에서 로컬 컴퓨터 이름을 어떻게 얻습니까? (0) | 2020.10.22 |
H.264 스트림에 대한 시퀀스 / 그림 매개 변수 세트의 가능한 위치 (0) | 2020.10.22 |
지정된 VM 설치를 찾을 수 없음 : 유형 표준 VM, 이름 jre7 (0) | 2020.10.22 |