Ответ 1
Это является полезным сообщением об этой проблеме.
Короче говоря, Rails автозагружает классы в вашем каталоге lib только в том случае, если они соответствуют соответствующим соглашениям об именах.
Скажем, у меня есть следующий файл в моем каталоге lib моего приложения rails:
#lib/proxy.rb
module SomeService
class ServiceProxy
def do_something
end
end
end
Если я хочу использовать ServiceProxy в модели, я могу использовать его так:
#app/models/product.rb
require 'proxy'
class Product < ActiveRecord::Base
def do_something
proxy = SomeService::ServiceProxy.new
proxy.do_something
end
end
Это работает, но я заметил, что если я хочу использовать ServiceProxy в другой модели, мне не нужно "требовать" прокси "во втором файле модели. Кажется, что" требует "прокси" " один раз в любой модели добавит его в путь поиска.
Может кто-нибудь объяснить это поведение и наилучшую практику, связанную с ним в приложении rails?
Спасибо!
UPDATE: Основываясь на приведенном ниже примере floyd, если мой файл ServiceProxy был сохранен как таковой,
#lib/some_service/service_proxy.rb
тогда мне не нужно явно требовать файл.
Это является полезным сообщением об этой проблеме.
Короче говоря, Rails автозагружает классы в вашем каталоге lib только в том случае, если они соответствуют соответствующим соглашениям об именах.
Я бы вообще поставил эту инструкцию require в файле config/initalizer, например. config/initializers/load_proxy.rb
Вы пытались удалить его с первой модели? Я верю, что Rails автоматически загрузит все файлы, которые у вас есть, в каталог lib
, если вы не указали явно require
.
Также обратите внимание, что некоторые environment.rb поставляются с этими комментариями:
Rails::Initializer.run do |config|
# Add additional load paths for your own custom dirs
# config.load_paths += %W( #{RAILS_ROOT}/extras )
config.load_paths << "#{RAILS_ROOT}/app/models/some_model_group"
config.load_paths << "#{RAILS_ROOT}/lib"
end
Rails автоматически добавит /lib /vendor /app
этот каталог в путь автозагрузки. Когда вам нужны какие-то константы, вам потребуется конкретный файл. И вам не нужно требовать его во второй раз, потому что это было бы бесполезно.