微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐