Как игнорировать папку в Zeitwerk для Rails 6?
Простой вопрос, но почему-то ответ ускользает от меня.
При переходе на Rails 6 с Zeitwerk я получаю:
Please, check the "Autoloading and Reloading Constants" guide for solutions.
(called from <top (required)> at APP_ROOT/config/environment.rb:7)
rails aborted!
Zeitwerk::NameError: wrong constant name Enforce-calls-to-come-from-aws inferred by Module from directory
APP_ROOT/app/junkyard/enforce-calls-to-come-from-aws
Possible ways to address this:
* Tell Zeitwerk to ignore this particular directory.
* Tell Zeitwerk to ignore one of its parent directories.
* Rename the directory to comply with the naming conventions.
Что кажется отличным: это папка нежелательной почты, и ее никогда не следует загружать, поэтому игнорировать ее имеет смысл.
Документы Zeitwerk на https://github.com/fxn/zeitwerk говорят
tests = "#{__dir__}/**/*_test.rb"
loader.ignore(tests)
loader.setup
это то, как вы игнорируете папку. Справедливо. Но как мне найтиloader
? В руководстве Rails по автозагрузке Zeitwerk (https://guides.rubyonrails.org/autoloading_and_reloading_constants.html) не упоминается, как напрямую игнорировать папки, но упоминается автозагрузчик, спрятанный вRails.autoloaders.main
, поэтому я решил, что
Rails.autoloaders.main.ignore("#{__dir__}/junkyard/**/*.rb")
или
Rails.autoloaders.main.ignore("#{__dir__}/app/junkyard/**/*.rb")
будет путь пойти. Не повезло. Я пробовал вставить этоapplication.rb
И в initializers/zeitwerk.rb
и ни один не работал.
Есть идеи, где и как игнорировать папку с Zeitwerk в Rails?
PS: да, я знаю, мне нужно просто удалить это из app
, и я буду. Но вопрос по-прежнему беспокоит.
2 ответа
Я столкнулся с той же проблемой, и оказалось, что он жаловался на имя папки.
Добавление этого в application.rb
может работать для вас:
Rails.autoloaders.main.ignore(Rails.root.join('app/junkyard'))
я добавил это в
config/initializers/zeitwerk.rb
:
Rails.autoloaders.each do |autoloader|
autoloader.ignore(Rails.root.join('app/ui'))
...