Как вы можете использовать метод настройки в ActionMailer Previews? - PullRequest
1 голос
/ 05 октября 2019

Я бы хотел избежать дублирования настроек для нескольких предварительных просмотров по почте. Какой лучший способ убрать это?

class MyMailerPreview < ActionMailer::Preview
  def email1
    setup
    mailer.email1
  end

  def email2
    setup
    mailer.email2
  end

  def email3
    setup
    mailer.email3
  end
end

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

Вот два возможных решения, которые я нашел:

Есть что-то под названием 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
0 голосов
/ 05 октября 2019

Исходя из моего понимания того, что вы спрашиваете, возможно, вы могли бы добавить его в один единственный метод, который принимает метод почтовой программы в качестве параметра

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

Будет ли это работать для вас?

...