Мне нужна следующая файловая структура:
app/components/foo/foo.rb
app/components/foo/_foo.html.haml
app/components/bar/bar.rb
app/components/bar/_bar.html.haml
Где я могу получить доступ к различным классам следующим образом:
Components::Foo
Components::Bar
Сейчас, чтобы автозагрузка работала правильно, она имеетбыть структурированным / закодированным / доступным следующим образом (гипотетически согласно соглашению Rails):
Components::Foo::Foo
Components::Bar::Bar
Это не имеет смысла.Я хочу, чтобы ранее упомянутая файловая структура, потому что я хочу, чтобы мои классы были автономными вместе с любыми ресурсами / и т.д.принадлежащий им.Я знаю, что если файл ruby попадет прямо внутрь app/components
, все будет хорошо, но это означает, что у меня есть одна папка и один файл для отслеживания, вместо одной папки.Не очень приятно.
Теперь меня беспокоит то, что, как и в приведенном здесь сценарии: Rails не в состоянии автоматически загружать константу только с первой попытки , автозагрузка явно работает, но всегда только при2-я попыткаПоскольку он настолько систематичен, кажется, что можно настроить его так, чтобы он всегда работал с 1-й попытки.
Это единственное добавление, которое я сделал к application.rb
:
config.eager_load_paths += Dir[Rails.root.join('app', 'components', '**/')]
Я знаю, что перезапуск сервера необходим в случае добавления новых каталогов / изменения существующей структуры каталогов, но это нормально, поскольку это происходит не очень часто.Очевидно, что изменение кода происходит очень часто, и хотя я могу постоянно обновлять страницу до тех пор, пока она не перезагрузит все константы, это очень расстраивает (и я даже не тестировал ее на производстве, но не будуудивляюсь, если он делает то же самое там при первой загрузке)с этим в любом случае, это все еще намного худшее решение, так как оно потребовало бы перезапуска сервера, если код был изменен (при условии, что требование выполняется в центральном месте, например в инициализаторе или в application.rb
).