Cyr*_*ris 8 ruby actionmailer ruby-on-rails-5
假设我有一个发送不同电子邮件的邮件程序,但预计会使用相同的参数调用.我想为所有邮件程序操作处理这些参数.因此,调用一个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
Run Code Online (Sandbox Code Playgroud)
然后在我的控制器/服务中我做某个地方
MyMailer.actionx(*mailer_params).deliver_now
Run Code Online (Sandbox Code Playgroud)
如何访问块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
Run Code Online (Sandbox Code Playgroud)
而这个重构
/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
Run Code Online (Sandbox Code Playgroud)
感觉不理想(prepare_mail(same_params)每个动作都重复)
因此,上面提出了什么
ActionMailer使用该AbstractController::Callbacks模块.我试过了,它似乎对我有用.
代码
class MyMailer < ApplicationMailer
def process_action(*args)
# process the args here
puts args
super
end
def some_mail(*args)
end
end
MyMailer.some_mail(1, 2) #=> prints ['some_mail', 1, 2]
Run Code Online (Sandbox Code Playgroud)
UPDATE
如果您正在使用Rails 5.1,您可以查看ActionMailer :: Parameterized
| 归档时间: |
|
| 查看次数: |
2513 次 |
| 最近记录: |