Rails 4에서 lib 파일 자동 로딩
/lib
개발하는 동안 이니셜 라이저에서 다음 줄을 사용하여 디렉토리에 코드를 자동로드합니다 .
config / initializers / custom.rb :
RELOAD_LIBS = Dir[Rails.root + 'lib/**/*.rb'] if Rails.env.development?
( Rails 3 Quicktip : 개발 모드에서 lib 폴더 자동 다시로드 )
훌륭하게 작동하지만 프로덕션 환경에서 사용하기에는 너무 비효율적입니다. 각 요청마다 lib를로드하는 대신 시작시로드하려고합니다. 동일한 블로그에는 이를 수행하는 방법을 설명하는 다른 기사 가 있습니다.
config / application.rb :
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
그러나 개발로 전환해도 lib 함수를 사용하려고하면 NoMethodErrors가 발생합니다.
내 lib 파일 중 하나의 예 :
lib / extensions.rb :
Time.class_eval do
def self.milli_stamp
Time.now.strftime('%Y%m%d%H%M%S%L').to_i
end
end
호출 Time.milli_stamp
하면 NoMethodError가 발생합니다.
나는 다른 사람들이 SO에 대해 비슷한 질문에 대답했다는 것을 알고 있지만, 그들은 모두 명명 규칙과 내가 걱정할 필요가없는 다른 문제를 다루는 것처럼 보입니다. 내 lib 클래스는 이미 요청 당로드를 위해 일 했습니다. 허가하는 시작 로드. 이것을하는 올바른 방법은 무엇입니까?
이것이 문제를 해결할 수 있다고 생각합니다.
에서 설정 / application.rb :
config.autoload_paths << Rails.root.join('lib')
lib 에서 올바른 이름 지정 규칙을 유지하십시오 .
에 lib 디렉토리 / foo.rb :
class Foo end
에 lib 디렉토리 / foo는 / bar.rb :
class Foo::Bar end
lib / extensions.rb 와 같은 파일에서 원숭이 패치를 실제로 수행 하려면 수동으로 필요할 수 있습니다.
에서 설정 / 초기화 / require.rb :
require "#{Rails.root}/lib/extensions"
추신
Bill Harding의 레일 3 개 자동로드 모듈 / 클래스 .
Rails가 자동 로딩에 대해 정확히 무엇을하는지 이해하려면? Rails 자동 로딩 – 작동 방식 및 Simon Coffey의 작동 방식을
읽습니다 .
이것이 질문에 직접 대답하지는 않지만 질문을 완전히 피하는 것이 좋은 대안이라고 생각합니다.
모든 피하려면 autoload_paths
나 eager_load_paths
에 "LIB"또는 "응용 프로그램"디렉토리 아래에 "기타"디렉토리를 만들고, 번거 로움을. 평소와 같이 코드를 배치하면 Rails는 모델 파일을로드하고 다시로드하는 것과 같은 방식으로 파일을로드합니다.
이것은 Rails가 클래스 로딩을 처리하는 방법에 대한 솔루션을 검색 할 때이 답변을 찾는 나와 같은 누군가를 도울 수 있습니다 ... 클래스를 정의하는 module
대신 이름이 내 파일 이름과 일치하는 이름 을 정의해야한다는 것을 알았습니다 .
lib / development_mail_interceptor.rb 파일에서 (예, Railscast의 코드를 사용하고 있습니다 :)
module DevelopmentMailInterceptor
class DevelopmentMailInterceptor
def self.delivering_email(message)
message.subject = "intercepted for: #{message.to} #{message.subject}"
message.to = "myemail@mydomain.org"
end
end
end
작동하지만 클래스를 모듈 안에 넣지 않으면로드되지 않습니다.
config.to_prepare를 사용하여 개발 모드에서 모든 요청에 대한 원숭이 패치 / 확장 프로그램을로드하십시오.
config.to_prepare do |action_dispatcher|
# More importantly, will run upon every request in development, but only once (during boot-up) in production and test.
Rails.logger.info "\n--- Loading extensions for #{self.class} "
Dir.glob("#{Rails.root}/lib/extensions/**/*.rb").sort.each do |entry|
Rails.logger.info "Loading extension(s): #{entry}"
require_dependency "#{entry}"
end
Rails.logger.info "--- Loaded extensions for #{self.class}\n"
종료
참고 URL : https://stackoverflow.com/questions/19098663/auto-loading-lib-files-in-rails-4
'Programing' 카테고리의 다른 글
Web Api의 요청과 일치하는 여러 조치가 발견되었습니다. (0) | 2020.04.18 |
---|---|
내 코드에서 모든 console.log 문을 빠르고 편리하게 비활성화하는 방법은 무엇입니까? (0) | 2020.04.18 |
git diff-긴 줄을 처리합니까? (0) | 2020.04.18 |
Android 대화 상자 Fragment vs Dialog (0) | 2020.04.17 |
왜리스트에 사전과 같은 안전한 "get"메소드가 없는가? (0) | 2020.04.17 |