【发布时间】:2015-04-22 11:09:25
【问题描述】:
假设我有一个发送不同电子邮件的邮件程序,但预计会使用相同的参数调用。我想为所有邮件操作处理这些参数。因此,调用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
如何访问before_action 块内的same_param 参数列表?
编辑:
我想重构
/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 发送电子邮件ruby-doc.org/stdlib-2.0.0/libdoc/net/smtp/rdoc/Net/SMTP.html。它将比 Action Mailer 更可定制。
-
从软件工程的角度来看,ActionMailer是一个适配器,可以配置好几种邮件投递方式(我目前用的是3-4种),恐怕SMTP不全在世界上,所以我想使用ActionMailer。
-
我认为您正在将逻辑部分从控制器移动到层中。最好在邮件程序类和控制器之间添加一个服务层/模型类来实现这一点,而不是覆盖默认邮件程序来实现你想要的。
-
@spickermann 抱歉忘记继承,现在添加。你可以考虑
ApplicationMailer就像ActionMailer::Base。在我之前的评论中,我只是解释说我不仅仅是通过 SMTP 直接发送邮件,还配置为使用:file、:cache、:letter_opener等由 ActionMailer 很好地包装的传递适配器 -
您的问题似乎可以通过 Rails 5.1 中的 parameterized mailers 解决(参见 PR)
标签: ruby actionmailer ruby-on-rails-5