Ruby on rails Heroku上的Rails ActionMailer拦截器

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

我尝试在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.register_interceptor(PrefixStagingMailSubject)
end
这在我的开发人员机器上运行良好。但它不在Heroku服务器上

偶尔我发现它在Desive发送的邮件中有效(例如,重置密码邮件)。这意味着拦截程序已经注册

但在我的邮件中,它仍然不起作用。例如my
ReportsMail

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
并让您知道。