в том числе модуль работает в разработке, дает сбой при запуске в производство? - PullRequest
2 голосов
/ 30 января 2011

Я создал модуль, который находится в моей папке 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.cache_classes = false в config/environments/production.rb, то я не будуполучите эту трассировку стека, и приложение будет работать в рабочем режиме так же, как и в режиме разработки !!

А как насчет настроек, которые config.cache_classes = false делает, чтобы модуль таким образом работал в производстве?Я включаю модуль неправильно / странным образом?

Ответы [ 2 ]

4 голосов
/ 30 января 2011

Надеюсь, я полностью прав, по крайней мере, я изложу свою точку зрения:

В процессе разработки все ваши классы загружаются лениво.Таким образом, вы можете легко изменить их, так как они загружаются только при необходимости.Это означает, что:

MyProject::Application.initialize!

не не загружает содержимое модуля, для которого требуется:

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

, которое включено впоследствии , это делаетвсе работает.

На производстве модули и классы действительно загружены => сбой, им нужны зависимости!

В результате введите:

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

винициализатор, который вы создаете в config/initializers, назовите его active_record_extension.rb, например.

0 голосов
/ 30 января 2011

Автозагрузка не работает для вашего сценария?

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

# lib/my_project/event_formatters.rb
module MyProject
  module EventFormatters
    # .. etc. ...
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...