Ruby on rails 如何在ActionMailer预览中使用设置方法?
我希望避免重复多次邮件预览的设置。最好的清理方法是什么Ruby on rails 如何在ActionMailer预览中使用设置方法?,ruby-on-rails,actionmailer,Ruby On Rails,Actionmailer,我希望避免重复多次邮件预览的设置。最好的清理方法是什么 class MyMailerPreview < ActionMailer::Preview def email1 setup mailer.email1 end def email2 setup mailer.email2 end def email3 setup mailer.email3 end end class MyMailerPreview
class MyMailerPreview < ActionMailer::Preview
def email1
setup
mailer.email1
end
def email2
setup
mailer.email2
end
def email3
setup
mailer.email3
end
end
class MyMailerPreview
根据我对您所问问题的理解,也许您可以将其添加到一个将mailer方法作为参数的方法中
class MyMailerPreview < ActionMailer::Preview
def email_for(emailx) # (Pass the method(email1, etc) as an argument where you're calling it
setup
mailer.send(emailx.to_sym) # Call the method param as a method on the mailer
end
end
class MyMailerPreview
这对你有用吗?我发现了两种可能的解决方案: 有一种叫做
preview\u拦截器
的东西在生成邮件预览时使用,您可以这样添加自己的:
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
config/environments/development.rb
config.action_mailer.preview_interceptors = :my_setup
class MySetup
def self.previewing_email(message)
message.subject = "New subject"
end
end
class UserMailerPreview < ActionMailer::Preview
include ActionMailer::Previews
register_preview_interceptor :my_setup
def welcome_email
UserMailer.with(user: User.first).welcome_email
end
end
test/mailers/previews/my_setup.rb
config.action_mailer.preview_interceptors = :my_setup
class MySetup
def self.previewing_email(message)
message.subject = "New subject"
end
end
class UserMailerPreview < ActionMailer::Preview
include ActionMailer::Previews
register_preview_interceptor :my_setup
def welcome_email
UserMailer.with(user: User.first).welcome_email
end
end
test/mailers/previews/user\u mailer\u preview.rb
config.action_mailer.preview_interceptors = :my_setup
class MySetup
def self.previewing_email(message)
message.subject = "New subject"
end
end
class UserMailerPreview < ActionMailer::Preview
include ActionMailer::Previews
register_preview_interceptor :my_setup
def welcome_email
UserMailer.with(user: User.first).welcome_email
end
end
我试图在类中包括Railsbefore\u action
,但它不会钩住previewer中的方法,因此我发现的第二个选项是在操作之前构建自己的,如下所示:
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
模块MySetup
行动前定义(*名称)
instance_methods(false)。每个do|method|
别名“旧方法”,方法
定义方法
名字。每个人都有名字
发送(姓名)
结束
发送(“旧方法”)
结束
结束
结束
结束
类UserMailerPreview
使用初始化方法。
只需覆盖父级initialize
方法,调用super
,然后运行安装程序:
class MyMailerPreview
您可以查看ActionMailer::Preview.new
方法作为参考。您可以在initialize
method@Tom我更新了几个解决方案的答案,这些解决方案可以与您的预览一起使用。我问的是mailer预览,而不是mailer本身。啊,很抱歉,我错过了预览担心截取程序在邮件实际呈现后才运行?如果不知道您到底想做什么,就很难知道它有多有用,但它确实会在邮件实际呈现到浏览器中之前点击预览\u email
方法。您可以在邮件呈现到浏览器中之前修改邮件本身的不同属性browser。例如,我可以更改电子邮件的主题,并在浏览器中看到我修改过的主题。如果这还不够,那么我认为您必须在执行操作之前创建自己的,或者按照当前的方式进行操作。除非您能弄清楚如何在执行操作之前使用内置的
r预览者,如果你这样做了,如果你能分享你是如何做到的,我将不胜感激:d