我找到了两种可能的解决方案:
有一个叫做 preview_interceptors
的东西,用于在生成邮件预览时使用,你可以像这样添加自己的拦截器:
config/environments/development.rb
config.action_mailer.preview_interceptors = :my_setup
test/mailers/previews/my_setup.rb
class MySetup
def self.previewing_email(message)
message.subject = "New subject"
end
end
test/mailers/previews/user_mailer_preview.rb
class UserMailerPreview < ActionMailer::Preview
include ActionMailer::Previews
register_preview_interceptor :my_setup
def welcome_email
UserMailer.with(user: User.first).welcome_email
end
end
message参数是ActionMailer::Parameterized::MessageDelivery
的一个实例,我不确定你可以对它做什么,但你可以在邮件本身上设置一些属性。
关于预览拦截器的文档很少,但在这里有一个链接,展示了Rails如何使用它们。
我试图在类中包含Rails的before_action
,但它无法钩住预览器中的方法,所以我发现的第二个选择是像这样构建自己的before_action
:
module MySetup
def before_action(*names)
UserMailer.instance_methods(false).each do |method|
alias_method "old_#{method}", method
define_method method do
names.each do |name|
send(name)
end
send("old_#{method}")
end
end
end
end
class UserMailerPreview < ActionMailer::Preview
extend MySetup
def welcome_email
UserMailer.with(user: User.first).welcome_email
end
before_action :setup
private
def setup
puts "Setting up"
end
end