升级Rails 6后ActiveJob报ActionMailer::MailDeliveryJob未定义错误求助
这个问题其实是Rails 6在邮件投递任务的默认配置上的变化导致的,我之前碰到过类似的情况,给你梳理下修复步骤和原因:
核心问题根源
在Rails 5.2中,官方引入了ActionMailer::MailDeliveryJob来替代旧的ActionMailer::DeliveryJob,但到了Rails 6.0,官方又把默认的邮件投递任务改回了ActionMailer::DeliveryJob,并且移除了MailDeliveryJob这个常量——这就是你看到错误提示的原因。而你手动在初始化文件里设置了旧的Job类,自然会触发未初始化常量的报错。
具体修复步骤
修正delivery_job配置
打开config/initializers/new_framework_defaults_6_0.rb,找到这一行:Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob"直接注释掉或者删除它就行。因为你已经在
config/application.rb里设置了config.load_defaults 6.0,Rails会自动把action_mailer.delivery_job默认配置为ActionMailer::DeliveryJob,也就是错误提示里建议的那个类。重启Sidekiq服务
配置变更需要重启Sidekiq才能生效,因为Sidekiq是在启动时加载所有Rails初始化配置的。本地开发环境直接重启Sidekiq进程;生产环境按照你的部署流程重启Sidekiq服务即可。排查其他手动引用
检查项目里有没有其他地方手动用到了ActionMailer::MailDeliveryJob(比如自定义Job继承、其他配置文件),如果有的话,全部替换为ActionMailer::DeliveryJob。
为什么邮件还能正常送达?
虽然报错,但邮件能发送的原因大概率是:当Rails找不到你指定的MailDeliveryJob时,会自动 fallback 到内部默认的投递逻辑,或者Sidekiq在捕获错误后仍然执行了邮件发送的核心代码。不过这个错误会污染你的日志和错误监控(比如Rollbar),必须修复。
内容的提问来源于stack exchange,提问作者Lucas Moulin

