Ошибка Zeitwerk при разработке почтовой программы в производственной среде
У меня есть Rails 6, мой класс предварительного просмотра находится в
почтовая программа / превью / devise_mailer_preview.rb:
class DeviseMailerPreview < ActionMailer::Preview
...
end
И когда я запускаю приложение локально, все идет хорошо, я вижу свои превью электронной почты на http://localhost:3000/rails/mailers/devise_mailer/confirmation_instructions
адрес. Но теперь я пытаюсь развернуть приложение на сервере и обнаружил, что когда я запускаюbundle exec rails c production
, Я получил ошибку:
/home/deploy/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/zeitwerk-2.3.0/lib/zeitwerk/loader/callbacks.rb:17:in ʻon_file_autoloaded': ожидается файл /home/deploy/project/releases/20200627024908/app/mailer/previews/devise_mailer_preview.rb для определения константы Previews::DeviseMailerPreview, но не (Zeitwerk::NameError)
После этого я проверил локально RAILS_ENV=production rails c
, и получил то же самое.
Если я переименую класс DeviseMailerPreview в Previews::DeviseMailerPreview, он будет сломан, и я не смогу видеть электронные письма о разработке, потому что Rails 6, в соответствии с документами, ожидает именно этого имени.
Более того, в этой статье я обнаружил, что zeitwerk можно настроить с помощьюautoload_paths
param, чтобы избежать ошибки NameError в Ruby. Я обнаружил, что у меня есть мой config / application.rb:
config.load_defaults 6.0
В любом случае я попытался добавить такую же строку в свой файл config / environment / production.rb, но это не помогло.
Что я делаю не так и как это исправить? Заранее спасибо!
3 ответа
В Rails 6 превью добавляются к путям автозагрузки, только еслиoptions.show_previews
верно, чего нет по умолчанию в производственной среде. См. исходный код здесь .
Причина этого в том, что предварительные версии должны помочь в разработке, и, как правило, это не то, на что вы хотите смотреть в производственной среде.
Однако вы можете установить этот флаг наtrue
в производстве, если хотите.
Есть еще одна производная: сохраняя превью в , Rails будет охотно загружать их, потому чтоapp/mailers
находится в путях автозагрузки. Еслиapp/mailers/previews
отсутствует в путях автозагрузки, активная загрузка не будет выполнена из-за несоответствия пространства имен. Либо они включены во всех средах, либо лучше иметь их в отдельном месте, например, по умолчанию.
Добавлятьpreview_path
кautoload_paths
и zeitwerk будет ожидатьDeviseMailerPreview
постоянная, подлежащая определению.
# development.rb
config.action_mailer.preview_path = Rails.root.join("app/mailers/previews")
# application.rb
config.autoload_paths << Rails.root.join("app/mailers/previews")
Ваш файл предварительного просмотра Mailer находится в mailer/previews/devise_mailer_preview.rb
, поэтому я предполагаю, что полный путь app/mailer/previews/devise_mailer_preview.rb
В документах говорится
В приведенном выше примере класс предварительного просмотра для
UserMailer
следует назватьUserMailerPreview
и расположен вtest/mailers/previews/user_mailer_preview.rb
Так положи свой devise_mailer_preview.rb
файл в test/mailers/previews/devise_mailer_preview.rb
или в вашем config/application.rb
добавьте эту строку и перезапустите:
config.action_mailer.preview_path = "#{Rails.root}/app/mailers/previews"
На самом деле ответ был в самой документации.