ApplicationMailer 约定 - 在邮件程序中传递数据与查找

ApplicationMailer convention - passing data vs. lookup in the mailer

我注意到 ApplicationMailers 接受的约定是将内部逻辑保持在最低限度,并将所需数据传递到邮件程序本身,而不是在邮件程序内部查找数据(ActiveRecord 记录)。我还没有真正找到解释 为什么 这是首选 - 谁能解释为什么这是趋势?

例如:

class FooMailer < ApplicationMailer
  # OK
  def foo_email(recipient, widget)
    @widget = widget
    mail(to: recipient, from: 'foo@bar.com', subject: 'Your widget')
  end

######
# VS #
######

  # Not OK
  def foo_email(recipient)
    @widget = Widget.first
    mail(to: recipient, from: 'foo@bar.com', subject: 'Your widget')
  end
end

谢谢!

一个字(好吧,三个):Single responsibility principle

在前面的示例中,ApplicationMailer 不需要了解您的模型的任何信息。而且,它不包含与选择 widget 相关的任何业务逻辑。

在后一个示例中,ActionMailer (1) 需要了解您的模型(有一个叫做 Widget 的东西)和 (2) 包含业务逻辑(Widget.first ).