2011-01-30 1 views
2

lib 폴더에있는 모듈을 작성했습니다. 나는 다음과 같이 내 environment.rb 파일에 넣어 시작시를 포함하고있어은 모듈 개발을 포함하여 생산시 시작시 실패합니까?

# Load the rails application 
require File.expand_path('../application', __FILE__) 

# Initialize the rails application 
MyProject::Application.initialize! 

ActiveRecord::Base.send :include, MyProject::Has::Formatter 
include MyProject::EventFormatters 

이 개발에서 잘 작동하지만 난 생산에 내 응용 프로그램을 배포하는 경우 생산 모드에서 실행하거나하려고하면 나는 다음과 같은 스택을 얻을

=> Booting WEBrick 
=> Rails 3.0.3 application starting in production on http://0.0.0.0:3000 
=> Call with -d to detach 
=> Ctrl-C to shutdown server 
Exiting 
C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-3.0.3/lib/active_record/base.rb:1008:in `method_missing': undefined local variable or method `has_formatter' for #<Class:0x808f830> (NameError) 
     from C:/Data/myproject/app/models/event.rb:2 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:227:in `load_dependency' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:346:in `require_or_load' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:300:in `depend_on' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:216:in `require_dependency' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/engine.rb:138:in `eager_load!' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/engine.rb:137:in `each' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/engine.rb:137:in `eager_load!' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/engine.rb:135:in `each' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/engine.rb:135:in `eager_load!' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/application.rb:108:in `eager_load!' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/application/finisher.rb:41 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/initializable.rb:25:in `instance_exec' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/initializable.rb:25:in `run' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/initializable.rb:50:in `run_initializers' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/initializable.rb:49:in `each' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/initializable.rb:49:in `run_initializers' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/application.rb:134:in `initialize!' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/application.rb:77:in `send' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/application.rb:77:in `method_missing' 
     from C:/Data/myproject/config/environment.rb:5 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:225:in `load_dependency' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:596:in `new_constants_in' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:225:in `load_dependency' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require' 
     from C:/Data/myproject/config.ru:3 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/rack-1.2.1/lib/rack/builder.rb:46:in `instance_eval' 
     from C:/Ruby187/lib/ruby/gems/1.8/gems/rack-1.2.1/lib/rack/builder.rb:46:in `initialize' 
     from C:/Data/myproject/config.ru:1:in `new' 
     from C:/Data/myproject/config.ru:1 

를 여기에서 지금 가장 마음이 모든 일의 불허 일부입니다 : 내가 config/environments/production.rbconfig.cache_classes = false를 설정하면 나는 그 스택 추적을하지 않고 앱이 동일하게 동작 서버가 시작하려고 할 때 추적 생산 모드에서 dev 모드로 !!

config.cache_classes = false 설정을 사용하면이 방식으로 모듈을 제작에 적용 할 수 있습니까? 모듈을 잘못된/이상한 방법으로 포함하고 있습니까?

개발에

는, 모든 클래스가로드 게으른 : 나는 완전히 해요

답변

4

희망, 오른쪽, 나는 적어도 내 관점을 제시합니다. 이렇게하면 필요할 때만로드되기 때문에 쉽게 변경할 수 있습니다. 이후 포함되어

ActiveRecord::Base.send :include, MyProject::Has::Formatter 
include MyProject::EventFormatters 

, 그것은 모든 일의 작업을합니다 :

MyProject::Application.initialize! 

이 필요 하지로드 모듈의 내용을 수행이 있음을 의미한다.

생산 과정에서 모듈과 클래스가 실제로로드 됨 => 크래시, 의존성이 필요합니다! 당신이 config/initializers에서 만든 이니셜 라이저에

ActiveRecord::Base.send :include, MyProject::Has::Formatter 
include MyProject::EventFormatters 

를 예를 들어 active_record_extension.rb를 호출 :

결과, 넣어.

0

시나리오에 따라 자동 로딩이 작동하지 않습니까?

# config/application.rb 
config.autoload_paths += %W(#{config.root}/lib) 

# lib/my_project/event_formatters.rb 
module MyProject 
    module EventFormatters 
    # .. etc. ... 
    end 
end 
관련 문제