Ошибка 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_pathsparam, чтобы избежать ошибки 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"

На самом деле ответ был в самой документации.

Другие вопросы по тегам