Supponiamo che abbia un mailer che invia email diverse, ma che è previsto che venga chiamato con gli stessi parametri. Voglio elaborare quei parametri per tutte le azioni del mailer. Quindi, chiamare un before_action
che leggere i parametri inviati al metodo mailerRails before_action per ActionMailer che utilizza gli argomenti del mailer
/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
Poi, nel mio controller/servizio che faccio qualche
MyMailer.actionx(*mailer_params).deliver_now
Come posso accedere alla lista same_param
argomenti all'interno del blocco before_action
?
EDIT:
voglio refactoring da
/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
E questo 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
Feels non ottimale (prepare_mail(same_params)
duplicati in ogni azione)
Quindi quello che era suggerito sopra
solo un pensiero - avete pensato di utilizzare solo Net :: SMTP direttamente per inviare messaggi di posta elettronica http://ruby-doc.org/stdlib-2.0.0 /libdoc/net/smtp/rdoc/Net/SMTP.html.Sarà più personalizzabile di Action Mailer. – zee
Dal punto di vista dell'ingegneria del software, ActionMailer è un adattatore, e puoi configurare diversi metodi di consegna delle email (attualmente sto usando 3-4), temo che SMTP non sia tutto ciò che c'è nel mondo, quindi voglio usare ActionMailer. –
Penso che stai spostando la parte logica dal controller al livello. È meglio aggiungere un livello di servizio/classe del modello tra la classe mailer e il controller per ottenere ciò, piuttosto che sovrascrivere il mailer predefinito per ottenere ciò che si desidera. – Sairam