自定义 ActionMailer 预览 header

Customizing ActionMailer Preview header

我想向我的操作邮件预览页面的 header 添加一些元数据。 我认为最简单的方法是在我的项目中的某个地方覆盖这个文件: https://github.com/rails/rails/blob/4-2-stable/railties/lib/rails/templates/rails/mailers/email.html.erb

看到 lib/templates 文件夹中的其他东西可以被覆盖,我认为类似的东西可以工作。我尝试了以下方法但没有成功:

是否可以以某种方式覆盖此文件,如果可以,在哪里?

好的,所以我最终成功了。不确定这是否是最佳解决方案,但它确实有效。

首先我复制了问题中提到的email.html.erb,放在了test/mailers/previews中。然后我对它进行了所需的自定义并将其重命名为 email_preview_heading.html.erb.

接下来我创建了一个新的初始化程序,它覆盖了 MailersController。我将原始代码中的整个预览方法放在里面,可以在这里找到:https://github.com/rails/rails/blob/4-2-stable/railties/lib/rails/mailers_controller.rb

我在初始化程序中所做的唯一更改是在第 35 行,如下所示,该行告诉预览控制器要使用哪个布局。方法的其余部分保持不变。

#config/initializers/email_preview_controller_override.rb
if Rails.env.development?
  class ::Rails::MailersController
    def preview
      ...
      render file: Rails.root.join('test/mailers/previews/email_preview_heading')
      ...
    end
  end
end

在布局文件中,我显示了作为 headers 传递给电子邮件的元数据,这意味着我可以像这样访问它们:@email.header['description']

确保仅在预览模式下通过 headers。

我可以通过在初始值设定项中添加 view_path 来覆盖 email.html.erb:

# config/initializers/email_preview_controller_override.rb    

if Rails.env.development?
  module OverrideMailerController
    def self.prepended(base)
      base.prepend_view_path Rails.root.join('test', 'mailers','previews')
    end
  end
      
  ::Rails::MailersController.prepend OverrideMailerController
end  

然后我把email.html.erb复制到/test/mailers/previews/rails/mailers。适用于 Rails 5.2.3

在 Rails 6 中,有必要将其包装在 Rails.configuration.to_prepare do 中以避免 DeprecationException 作为 ,如下所示:

if Rails.env.development?
  Rails.configuration.to_prepare do
    module OverrideMailerController
      def self.prepended(base)
        base.prepend_view_path Rails.root.join('test', 'mailers','previews')
      end
    end

    ::Rails::MailersController.prepend OverrideMailerController
  end
end