Предположим, у меня есть почтовая программа, которая отправляет разные электронные письма, но ожидается, что она будет вызываться с одинаковыми параметрами. Я хочу обрабатывать эти параметры для всех действий почтовой программы. Таким образом, вызов 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
Затем в моем контроллере/сервисе я где-то делаю
MyMailer.actionx(*mailer_params).deliver_now
Как я могу получить доступ к списку аргументов 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
И этот рефакторинг
/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)
повторяется в каждом действии)
Отсюда то, что было предложено выше
ApplicationMailer
похожим наActionMailer::Base
. В моем предыдущем комментарии я просто объяснял, что я не только отправляю почту напрямую через SMTP, но также настраиваю использование адаптеров доставки:file
,:cache
,:letter_opener
и т. д., которые хорошо упакованы ActionMailer - person Cyril Duchon-Doris   schedule 15.01.2017prepare_mail
, что я просто устанавливаю переменные экземпляра, которые будут напрямую использоваться в представлении ActionMailer. В противном случае мне пришлось бы передать слишком много параметров - person Cyril Duchon-Doris   schedule 15.01.2017before_action
сделать что-то вродеc.prepare_mail(*arguments_sent_to_mailer_action)
. Я только что отредактировал, надеюсь так понятнее - person Cyril Duchon-Doris   schedule 15.01.2017before_action
определяется вAbstractController::Callbacks
. Этот метод не существует в контексте Mailer. Если вы действительно хотите использовать обратные вызовы в контексте Mailer, вам необходимо реализовать логику для их использования. Вы можете заглянуть вActiveSupport::Callbacks
. - person spickermann   schedule 16.01.2017Callbacks in Action Mailer are implemented using AbstractController::Callbacks
(по крайней мере, в Rails 4-5, да, я знаю, что странно, что они не рефакторили это имя) иbefore_action
РАБОТАЮТ. api.rubyonrails.org/classes/ActionMailer/Base.html - person Cyril Duchon-Doris   schedule 16.01.2017