用于ActionMailer的Rails before_action将使用邮件程序参数

Cyr*_*ris 8 ruby actionmailer ruby-on-rails-5

假设我有一个发送不同电子邮件的邮件程序,但预计会使用相同的参数调用.我想为所有邮件程序操作处理这些参数.因此,调用一个before_action将读取发送到邮件程序方法的参数

/mailers/my_mailer.rb
class MyMailer < ApplicationMailer
    before_filter do |c|
      # c.prepare_mail # Will fail, because I need to pass `same_param` arguments
      # # I want to send the original arguments
      # c.prepare_mail(same_param) # How do I get `same_param` here ?
    end

    def action1(same_param)
      # email view is going to use @to, @from, @context    
      method_only_specific_to_action1
    end

    def action2(same_param)
      # email view is going to use @to, @from, @context
      method_only_specific_to_action2
    end

    private
      def prepare_mail(same_params)
        @to = same_params.recipient
        @from = same_params.initiator
        @context = same_params.context
      end
    end
Run Code Online (Sandbox Code Playgroud)

然后在我的控制器/服务中我做某个地方

MyMailer.actionx(*mailer_params).deliver_now
Run Code Online (Sandbox Code Playgroud)

如何访问块same_param内的参数列表before_action

编辑:

我想重构一下

/mailers/my_mailer.rb
class MyMailer < ApplicationMailer

    def action1(same_param)
      @to = same_params.recipient
      @from = same_params.initiator
      @context = same_params.context   
      method_only_specific_to_action1
    end

    def action2(same_param)
      @to = same_params.recipient
      @from = same_params.initiator
      @context = same_params.context   
      method_only_specific_to_action2
    end

    def actionx
      ... 
    end
  end
Run Code Online (Sandbox Code Playgroud)

而这个重构

/mailers/my_mailer.rb
class MyMailer < ApplicationMailer

    def action1(same_param)
      prepare_mail(same_params)   
      method_only_specific_to_action1
    end

    def action2(same_param)
      prepare_mail(same_params)   
      method_only_specific_to_action2
    end

    def actionx
      ... 
    end

    private
      def prepare_mail(same_params)
        @to = same_params.recipient
        @from = same_params.initiator
        @context = same_params.context
      end
    end
Run Code Online (Sandbox Code Playgroud)

感觉不理想(prepare_mail(same_params)每个动作都重复)

因此,上面提出了什么

hsl*_*luo 9

ActionMailer使用该AbstractController::Callbacks模块.我试过了,它似乎对我有用.

代码

class MyMailer < ApplicationMailer
  def process_action(*args)
    # process the args here
    puts args
    super
  end

  def some_mail(*args)
  end
end

MyMailer.some_mail(1, 2) #=> prints ['some_mail', 1, 2]
Run Code Online (Sandbox Code Playgroud)

文档


UPDATE

如果您正在使用Rails 5.1,您可以查看ActionMailer :: Parameterized

  • 我也不知道。实际上,如果您使用的是 Rails 5.1,您可以查看 [ActionMailer::Parameterized](http://api.rubyonrails.org/v5.1/classes/ActionMailer/Parameterized.html) (2认同)