Кто-то, кто понимает, как работает кэширование рельсов, может действительно помочь мне здесь. Вот код, вложенный в блок Rails :: Initializer.run:
config.after_initialize do
SomeClass.const_set 'SOME_CONST', 'SOME_VAL'
end
Теперь, если я запусту script/server
и сделаю запрос, все будет отлично. Тем не менее, во втором запросе к моему приложению Rails все идет к черту с унифицированной постоянной ошибкой. В производственном режиме я могу успешно выполнить второй запрос, то есть константа все еще там.
Я исправил проблему, изменив вышеприведенное на:
config.after_initialize do
require 'some_class' # in RAILS_ROOT/lib/some_class.rb
SomeClass.const_set 'SOME_CONST', 'SOME_VAL'
end
Но теперь это означает, что когда бы я ни вносил изменения в some_class.rb, я должен перезапускать сервер. Есть ли способ установить константы в файле среды и правильно ли они работают в режиме разработки? Почему константа существует в первом запросе, а не в следующем?
ОБНОВЛЕНИЕ: Поскольку environment.rb читается только при загрузке приложения Rails, и я хочу, чтобы мои файлы lib и модели перезагружались при каждом запросе, я был вынужден переместить константы в some_class Файл .rb выглядит следующим образом:
if Rails.env.development?
const_set 'SOME_CONST', 'SOME_DEVELOPMENT_VAL'
end
А в средах / production.rb у меня есть старый код const_set.
ОБНОВЛЕНИЕ: Еще лучший способ с использованием config.to_prepare подробно описан ниже.