Ruby on rails Heroku上的Rails ActionMailer拦截器
我尝试在Rails应用程序中注册一些Ruby on rails Heroku上的Rails ActionMailer拦截器,ruby-on-rails,heroku,actionmailer,Ruby On Rails,Heroku,Actionmailer,我尝试在Rails应用程序中注册一些ActionMailer拦截器。 例如,在my/config/initializers/mailer.rb中 if Rails.env.staging? class PrefixStagingMailSubject def self.delivering_email(mail) mail.subject = "TEST #{mail.subject}" end end ActionMailer::Base.registe
ActionMailer
拦截器。
例如,在my/config/initializers/mailer.rb中
if Rails.env.staging?
class PrefixStagingMailSubject
def self.delivering_email(mail)
mail.subject = "TEST #{mail.subject}"
end
end
ActionMailer::Base.register_interceptor(PrefixStagingMailSubject)
end
这在我的开发人员机器上运行良好。但它不在Heroku服务器上
偶尔我发现它在Desive发送的邮件中有效(例如,重置密码邮件)。这意味着拦截程序已经注册
但在我的邮件中,它仍然不起作用。例如myReportsMail
class ReportsMailer < ActionMailer::Base
def report_email(email, title, public_url)
subject = "The #{title} report you've requested was generated"
body = <<-EOS
The #{title} report you've requested was generated
You can download it by clicking the link below:
------------
#{public_url}
EOS
mail(to: email, subject: subject, body: body)
end
end
class ReportsMailer
消息发送由Sidekiq处理。
但我完全忘记了Sidekiq有自己的ENV
我有config/initializers/mailer.rb
和以下代码
if Rails.env.staging?
class PrefixStagingMailSubject
def self.delivering_email(mail)
mail.subject = "TEST #{mail.subject}"
end
end
ActionMailer::Base.register_interceptor(PrefixStagingMailSubject)
end
所以我认为问题在于Sidekiq运行时没有指定
ENV
并具有一些默认的ENV
(可能是开发)
我更新了我的Procfile,就像
web: ...
worker: bundle exec sidekiq -e $SIDEKIQ_ENV ...
并在Heroku配置中设置SIDEKIQ_ENV=staging
现在一切都正常了。您可以检查应用程序的RAILS\u ENV环境变量吗?这应该是staging
,而不是production
@eugen,这也是我一开始的想法。但重置密码邮件在主题中带有测试。这意味着RAILS_ENV=staging,甚至拦截器注册正确。这确实很奇怪,如果它对一个邮件程序有效,我不明白为什么它对所有邮件程序无效。我有一个类似的拦截器可以工作,唯一的区别是我用Mail.register\u interceptor
注册它,而不是ActionMailer::Base.register\u interceptor
,我在设置ActionMailer::Base.smtp
其余设置之前注册它。不过,我怀疑这会有什么不同。@eugen我同意你的看法,这很奇怪)谢谢你的建议。我曾经考虑过加载顺序的重要性,但在开发过程中,它们都能正常工作。我将尝试使用Mail
而不是ActionMailer::Base
并让您知道。