Не используйте require
при попытке загрузить файл, содержащий перезаряжаемую константу.
Как правило, вам не нужно ничего делать, чтобы использовать эту константу. Вы просто будете использовать константу напрямую, без необходимости использовать require
или что-нибудь еще.
Но если вы хотите быть кристальной чистотой с вашим кодом, ActiveSupport
предоставляет вам различного метода, который можно использовать для загрузки этих файлов: require_dependency
.
require_dependency 'test_service'
class IndexController < ApplicationController
...
end
Хотя это сбивает с толку, что вы пытаетесь быть кристальной чистоты и явно загрузить файл, содержащий TestService
, но явно не загрузить файл, содержащий ApplicationController
....
Вам не нужно менять autoload_paths
конфигурации ,
Update 1
Для того, чтобы позволить Rails найти и загрузить свои константы (классы и модули), вам нужно сделать следующее:
Вы должны быть уверены, что каждый пополняемые постоянным в вашем приложение находится в файле с правильным именем файла. Файл всегда должен находиться в некотором подкаталоге app
, например app/models
или app/services
или в любом другом поддиректории. Если константа называется TestService
, имя файла должно заканчиваться test_service.rb
.
Алгоритм: "TestService".underscore + ".rb" #=> "test_service.rb"
.
filename_glob = "app/*/" + the_constant.to_s.underscore + ".rb"
Так что, если константа TestService
, то Глоб является app/*/test_service.rb
.Так что прилипание константы в app/services/test_service.rb
будет работать, как и app/models/test_service.rb
, хотя последняя плохая форма. Если константа была SomeModule::SomeOtherModule::SomeClass
, вам нужно будет поместить файл в app/*/some_module/some_other_module/some_class.rb
.
Добавление require_dependency ... похоже, работает. Однако, если я удалю его, изменения в TestService не будут загружены. – 3coins
Отменить изменение конфигурации 'autoload_paths'. Не устанавливайте эту конфигурацию вообще. – yfeldblum
Я уже удалил это. Получите эту ошибку, если я не требую или require_dependency в контроллере. uninitialized constant IndexController :: TestService – 3coins