Вот два возможных решения, которые я нашел:
Есть что-то под названием 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
Параметр сообщения является экземпляром ActionMailer::Parameterized::MessageDelivery
, я не уверен, что все, что вы можетеделать с этим, но вы можете установить некоторые атрибуты в самом письме.
Я не смог найти много документации по перехватчикам предварительного просмотра, но вот ссылка на то, как они используются в Rails.
# Previews can also be intercepted in a similar manner as deliveries can be by registering
# a preview interceptor that has a <tt>previewing_email</tt> method:
#
# class CssInlineStyler
# def self.previewing_email(message)
# # inline CSS styles
# end
# end
#
# config.action_mailer.preview_interceptors :css_inline_styler
#
# Note that interceptors need to be registered both with <tt>register_interceptor</tt>
# and <tt>register_preview_interceptor</tt> if they should operate on both sending and
# previewing emails.
Я пытался включить 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