Предположим, у меня есть почтовая программа, которая отправляет разные электронные письма, но ожидается, что они будут вызываться с теми же параметрами. Я хочу обработать эти параметры для всех действий почтовой программы. Таким образом, вызов before_action
который будет считывать параметры, отправленных метод почтовой программыRails before_action для ActionMailer, который использовал бы аргументы почтовой программы
/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
блока ?
EDIT:
Я хочу, чтобы реорганизовать от
/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)
дублируется в каждом действии)
Поэтому то, что было предложенный выше
только мысль - вы думали только с помощью Net :: STMP напрямую отправлять сообщения электронной почты http://ruby-doc.org/stdlib-2.0.0 /libdoc/net/smtp/rdoc/Net/SMTP.html.Он будет более настраиваемым, чем Action Mailer. – zee
С точки зрения программного обеспечения, ActionMailer является адаптером, и вы можете настроить несколько методов доставки электронной почты (в настоящее время я использую 3-4), я боюсь, что SMTP не все есть в мире, поэтому я хотите использовать ActionMailer. –
Я думаю, что вы перемещаете логическую часть от контроллера в слой. Лучше всего добавить класс уровня обслуживания/класса между классом почтовой программы и контроллером, чтобы добиться этого, а не переопределять почтовую программу по умолчанию для достижения того, чего вы хотите. – Sairam