传递给UserMailer的参数是否可用于before_actions?

时间:2017-07-21 20:34:01

标签: ruby-on-rails ruby-on-rails-4

我想根据传递给邮件程序的参数为多个电子邮件分配相同的实例变量集。像这样:

class UserMailer < ActionMailer::Base
  before_action -> { set_defaults(order) }, only: [:email1, :email2]

  def email1(order)
    ...
  end

  def email2(order)
    ...
  end

  private
    set_defaults(order)
      @order = order
      @customer = order.customer
      @price = order.price
    end
end

我发现您可以将paramsstrings等传递给控制器​​中的before_actions:Rails 4 before_action, pass parameters to invoked method

看起来我可以使用process_action作为解决方法:Rails before_action for ActionMailer that would use mailer arguments

但有没有办法获取参数?它们是否超出范围?帮助

1 个答案:

答案 0 :(得分:2)

这个?

DO_ME_BEFORE = [:email1, :email2]

def process_action(*args)
    return super unless DO_ME_BEFORE.include?(args[0].to_sym)
    @order = args[1]
    @customer = @order.customer
    @price = @order.price
    super
end

编辑: 我不认为您可以使用与before_action完全相同的方式进行挂钩,但您可以模拟它,因为您的args[0]将是方法的名称。如果您将允许的方法数组写为字符串,则无需在.to_sym上的args[0]上调用.include?()