Rails - почему модель внутри RAILS_ROOT / lib недоступна в производственном режиме?

У меня есть класс, расположенный внутри папки RAILS_ROOT / lib, который я использую в одном из моих помощников, и он отлично работает в разработке.

Когда я переключаюсь на продакшн, приложение выдает NameError (uninitialized constant SomeHelper::SomeClass), и мне приходится загружать его вручную в помощнике:

load "#{Rails.root}/lib/some_class.rb"

module SomeHelper
  def some_method
    sc = SomeClass.new
    # blah
  end
end

У меня создалось впечатление, что все внутри RAILS_ROOT / lib / * должно быть доступно для всего приложения - есть ли что-нибудь, что мне нужно настроить, чтобы это произошло в режиме prod? Благодарю.


person sa125    schedule 20.05.2010    source источник


Ответы (2)


Когда вы вызываете SomeHelper :: SomeClass, механизм автозагрузки Rails попытается загрузить файл по адресу lib / some_helper / some_class.rb

Rails не будет загружать все в lib / *, он будет пытаться загрузить файлы только при возникновении ConstMissing.

person Vojto    schedule 24.05.2010

Возможно, вам потребуется проверить различия между параметрами конфигурации между средой разработки и производственной средой: config/environments/production.rb и config/environments/development.rb.

Во время процедуры инициализации Rails вызывается load_plugins(), который загружает все плагины в config.plugin_paths. Вам нужно убедиться, что ваша папка lib/ включена, как в

config.plugin_paths = ["# {RAILS_ROOT} / lib / plugins", "# {RAILS_ROOT} / vendor / plugins"]

Помимо config.plugin_paths, вы также можете назвать плагины, которые должны быть загружены в config.plugins. Если эта переменная содержит :all, будут загружены все плагины (найденные).

(Между прочим: настройки конфигурации, одинаковые для любой среды, должны быть указаны в config/environment.rb. Любые различия между средами обусловлены настройками в соответствующих .rb файлах.)

person Jochem Schulenklopper    schedule 24.05.2010