Ruby on rails 最好附加一个简单函数作为类方法或模块?

Ruby on rails 最好附加一个简单函数作为类方法或模块?,ruby-on-rails,ruby,module,class-method,Ruby On Rails,Ruby,Module,Class Method,我有一个简单的功能,可以防止在本地测试时向客户发送电子邮件: def safe_emails emails if Rails.env == 'production' emails else emails.select{|e| ['staff@example.com', 'staff2@example.com'].include?(e) } end end 我想在邮寄者之间共享该功能。我可以看到两个选项,模块或类方法 备选案文1:模块 class ReportMail

我有一个简单的功能,可以防止在本地测试时向客户发送电子邮件:

def safe_emails emails
  if Rails.env == 'production'
    emails
  else
    emails.select{|e| ['staff@example.com', 'staff2@example.com'].include?(e) }
  end
end
我想在邮寄者之间共享该功能。我可以看到两个选项,模块或类方法

备选案文1:模块

class ReportMailer < ActionMailer::Base
  include SafeEmailer

  def daily emails
    mail_to: safe_emails(emails)
  end
end
class ReportMailer
选项2:类方法

class ReportMailer < ActionMailer::Base
  def daily emails
    mail_to: SafeEmailer.safe_emails(emails)
  end
end
class ReportMailer

由于全局范围的原因,类方法是一个禁忌,包括一个带有一个方法的模块似乎没有那么吸引人。Monkey patching ActionMailer将该方法放入其中似乎也会带来麻烦(当Rails 4.3引入安全电子邮件方法或其他方法时)。

我会选择模块选项,即使它是一个简单的单功能模块。在一个模块中保留一个最终可由多个类使用的泛型函数比在一个类中定义它更有意义


如果您关心Rails 4.3,那么您可以简单地用Rails 4.3包含此功能的任何内容替换您的
include MySafeEmailModule
,而不是查找和替换对
ReportMailer.daily\u电子邮件的所有调用

两者都不是–在您的情况下,您需要一个策略对象,它决定谁接收有关
Rails.env
的电子邮件。我会将这种逻辑保留在
报告邮件程序
之外

我会选择这样的方式:

UserMailer.welcome_email(@user).deliver if SafeEmailer.new(@user.email).safe?

这可能是最简单的方法

在非生产环境中设置以下配置。(config/environments/.rb)


看看宝石。您可以将delivery_方法设置为
letter_opener
,并在浏览器中打开电子邮件,而不是在您的非生产环境中实际发送电子邮件。

这一点很好,但如果我尝试在开发环境中发送电子邮件或将邮件转移到非开发环境中,我可以提出一个异常,我也不想让每一个打给邮递员的电话都受到这个政策的制约。真是太棒了。在我们的例子中,我们需要将测试电子邮件转发给上级,以便在开发过程中进行审查,而使用网页则更难。
config.action_mailer.delivery_method = :smtp (default), :sendmail, :test, or :file