Я хочу назначить один и тот же набор переменных экземпляра для нескольких писем на основе аргумента, переданного в почтовую программу. Что-то вроде этого:

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

Я вижу, что вы можете передать params, strings и т.п. в before_actions в контроллерах: Rails 4 before_action, передать параметры вызываемому методу

И похоже, что я могу использовать process_action в качестве обходного пути: Rails before_action для ActionMailer, который будет использовать аргументы почтовой программы

Но есть ли способ получить доступ к аргументам? Они выходят за рамки? Помощь.

0
Tracy Fu 21 Июл 2017 в 23:34
Вы можете получить к ним доступ, а они нет?
 – 
m3characters
21 Июл 2017 в 23:50
Я имею в виду конкретно в рамках before_action? Когда я тестирую в консоли rails, выдается ошибка.
 – 
Tracy Fu
21 Июл 2017 в 23:53
Трейси (а почему я не могу @ кого-то здесь, а кого-то могу?). Вам просто нужно использовать метод process_action, как описано во второй ссылке.
 – 
m3characters
21 Июл 2017 в 23:57
Я думаю, что вы не можете @ задать вопрос, потому что все комментарии автоматически отправляются запрашивающему и не требуют тегов (meta.stackexchange.com/questions/43019/…)
 – 
Tracy Fu
22 Июл 2017 в 00:02
ТАК такой умный, спасибо, что это действительно объясняет
 – 
m3characters
22 Июл 2017 в 12:24

1 ответ

Лучший ответ

Эта ?

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?()

2
m3characters 22 Июл 2017 в 00:08
Я хочу обрабатывать аргументы только для некоторых действий, а не для всех. Есть ли способ сделать это?
 – 
Tracy Fu
21 Июл 2017 в 23:58