Angenommen, ich habe einen Mailer, der verschiedene E-Mails sendet, aber voraussichtlich mit den gleichen Parametern aufgerufen wird. Ich möchte diese Parameter für alle Mailer-Aktionen verarbeiten. Also, ein before_action
Aufruf, dass die Parameter an die Versandmethode gesendet lesen würdeRails before_action für ActionMailer, der Mailer-Argumente verwenden würde
/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
Da ist in meinem Controller/Service muss ich irgendwo
MyMailer.actionx(*mailer_params).deliver_now
Wie kann ich die same_param
Argumente Liste innerhalb des before_action
Block zugreifen ?
EDIT:
ich von
/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
Refactoring wollen Und das Refactoring
/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
Man fühlt sich nicht optimal (prepare_mail(same_params)
in jeder Aktion dupliziert)
So was war vorgeschlagen über
nur ein Gedanke - haben Sie daran gedacht, nur mit net :: STMP direkt E-Mails senden http://ruby-doc.org/stdlib-2.0.0 /libdoc/net/smtp/rdoc/Net/SMTP.html.Es wird anpassbarer als Action Mailer. – zee
Aus Sicht der Softwaretechnik ist ActionMailer ein Adapter, und Sie können mehrere E-Mail-Zustellungsmethoden konfigurieren (ich verwende derzeit 3-4), ich fürchte, SMTP ist nicht alles, was es auf der Welt gibt, also ich möchte ActionMailer verwenden. –
Ich denke, Sie bewegen Logikteil vom Controller in die Schicht. Am besten ist es, eine Serviceschicht/Modellklasse zwischen Mailer-Klasse und Controller hinzuzufügen, um dies zu erreichen, anstatt den Standard-Mailer zu überschreiben, um das zu erreichen, was Sie wollen. – Sairam