Подобные вопросы задавались много раз. Однако у меня немного другой сценарий, и я все еще не нашел чистого решения следующей проблемы при разработке приложения на Rails 3:
У меня есть код ruby, расположенный в одном файле. Этот код представляет собой один модуль MyModule
, который содержит несколько классов. Я не могу изменить этот код, потому что он автоматически генерируется внешним инструментом. Имя файла my_module.rb
, и оно находится в папке lib
. Это обычное место для кода, который не принадлежит основному веб-приложению. Я убедился, что он загружается автоматически, когда я получаю доступ к MyModule на одном из контроллеров моего приложения, изменив настройку config.autoload_paths
в application.rb
.
Теперь мне нужно заново открыть один из классов в MyModule
. Я создал отдельный файл some_class.rb
, куда я поместил следующий код:
class MyModule::SomeClass
def some_new_method
...
end
end
Мой вопрос: как лучше всего разместить этот код? А каким должно быть имя файла?
То, что я пробовал:
- Размещение кода в папке
initializers
. он отлично работает в производственной среде. Однако он ломается в development
, потому что код в папке initiliazers
загружается один раз при запуске сервера и lib
перезагружается при каждом запросе. Итак, первый запрос в разработке работает нормально, однако последующие запросы терпят неудачу. Кроме того, я не люблю помещать код в initializers
, потому что это на самом деле не часть инициализации, а скорее часть бизнес-логики.
- Размещение кода в папке
lib
также не работает. Это не загружено. Только my_module.rb
есть.
- Поместите код в
lib
или другую папку в app
, а затем явно requir
в контроллеры. Опять же, он работает в производстве, но не развивается по той же причине, что и в случае № 1.
- Я отключил автоматическую загрузку, поместил
my_module.rb
и some_class.rb
в папку lib
и require
отредактировал их в инициализаторе. Я думаю, что это лучший подход. Недостатком является то, что мне все еще нужно создать собственный инициализатор, и код не загружается лениво.
UPDATE:
5. Благодаря предложению Рэгги, с включенной автозагрузкой, я вставил require_dependency 'some_class'
в свой контроллер. В этом случае some_class.rb
загружается на каждый запрос в режиме разработки. Это мой предпочтительный подход. Тем не менее, он по-прежнему требует своего рода require
:)
Помните, что файлы в папке lib
загружаются автоматически. Rails проверяет папку только тогда, когда вы используете модули или классы, которые rails не может найти. Имя файла должно соответствовать соглашению об именах, поэтому имя my_module.rb
.
Интересно, есть ли решение, когда оба файла автоматически загружаются без любых require
операторов.