ruby – 用于ActionMailer的Rails before_action,它将使用邮件程序参数

假设我有一个邮件发送不同的电子邮件,但预计将使用相同的参数调用.我想为所有邮件程序操作处理这些参数.因此,调用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,@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

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

MyMailer.actionx(*mailer_params).deliver_Now

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

编辑:

我想重构一下

/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

而这个重构

/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

感觉非最佳(prepare_mail(same_params)在每个动作中重复)

因此,上面提出了什么

解决方法

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]

The documentation

UPDATE

如果您使用的是Rails 5.1,可以查看ActionMailer::Parameterized

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...