Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在ActionMailer预览中使用设置方法?_Ruby On Rails_Actionmailer - Fatal编程技术网

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          
我试图在类中包括Rails
before\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