自定义ActionMailer预览标题

4
我希望能够在我的操作邮件预览页面的标题中添加一些元数据。 我认为最简单的方法是在项目中覆盖此文件: https://github.com/rails/rails/blob/4-2-stable/railties/lib/rails/templates/rails/mailers/email.html.erb 考虑到其他内容可以在lib/templates文件夹中被覆盖,我认为类似的方法可能也适用。我已经尝试了以下方法但没有成功:
  • lib\templates\rails\mailers\email.html.erb
  • lib\templates\mailers\email.html.erb
  • lib\rails\templates\rails\mailers\email.html.erb

有没有办法覆盖这个文件,如果有的话在哪里?

Screenshot of where I want the metadata


您可以像这样为您的邮件创建新布局:http://edgeguides.rubyonrails.org/action_mailer_basics.html - Alexander Luna
@AlexanderLuna 不是很,邮件布局只影响实际的电子邮件内容,而不影响预览信息。 - David Svensson
2个回答

3

好的,最终我解决了这个问题。不确定是否是最佳解决方案,但它起作用了。

首先,我复制了提问中提到的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

在布局文件中,我正在显示传递为邮件头的元数据,这意味着我可以像这样访问它们:@email.header ['description']。但请确保仅在预览模式下传递标题。

3

我通过在初始化器中添加一个视图路径(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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接