【问题标题】:Rails Mailer Best Practice - controller or after_create callback? [closed]Rails Mailer 最佳实践 - 控制器或 after_create 回调? [关闭]
【发布时间】:2014-07-10 22:59:43
【问题描述】:

在常见的 Ruby on Rails 3/4 应用程序中,有两个选项可以在创建模型后传递邮件:

1) 直接从控制器的创建操作发送邮件

#listings_controller.rb

def create
    @listing.create(params[:listing])
    if @listing.save
        ListingMailer.new_listing_notice(@listing).deliver
        format.html {redirect_to @listing}
        ...
    end
end

2)通过模型回调发送邮件

#listing.rb


class Listing
    after_create :notify
    ...
    def notify
        ListingMailer.new_listing_notice(self).deliver
    end
end

目前是否就哪种方式更好达成共识?从控制器发送可以提供更多控制权,但是如果始终发送邮件,是否有任何理由不使用回调?这主要是风格问题,还是有其他重要问题?

【问题讨论】:

  • 发送电子邮件是一个上下文问题。所以请不在模型中。检查这种方法:github.com/krisleech/wisper
  • 模型中电子邮件的荒谬示例:您导入带有用户的 csv,会向他们发送电子邮件以感谢他们的注册?上下文...

标签: ruby-on-rails email


【解决方案1】:

通常,维护模型中具有after_* 挂钩的代码要困难得多。当然,在某些情况下,使用回调是非常合理的(例如,在某些应用程序中应该一直进行计算校验和),但这些情况是规则的例外。

在您的电子邮件示例中,以下是回调方法的一些缺点:

邮件界面和列表模型因不同原因发生变化 (Single Responsibility Principle)。

例如,您希望使用特殊队列发送电子邮件。与队列通信的接口不应该以任何方式影响列表模型的构建方式。

您的应用程序不需要一直发送电子邮件。

电子邮件只是与外界互动的一种方式。并非所有的业务逻辑都需要与外部世界联系起来。正如apneadiving 提到的那样,其中一个例子是导入。另一个例子是控制台界面(您想在使用 rails 控制台时收到电子邮件吗?)

测试很困难。

这更多是 1 和 2 的结果,但随着时间的推移,测试 after 钩子变得越来越困难。在测试列表模型时需要模拟邮件程序,这使得测试变得不清楚,并且在发生变化时更难以维护。

【讨论】:

  • 我正在使用 ColdFusion/CFWheels(Ruby on Rails 模拟框架),但我认为我的问题可能仍然没问题......如果我们只通过控制器发送邮件,如果(例如)应该做什么评论控制器创建一个新用户(提交评论时自动创建新用户) - 就像用户控制器中的注册表单,但仍需要相同的欢迎电子邮件?我必须记住在控制器中发送一条欢迎消息,该控制器可能对 People 的规则一无所知,这似乎......不好。我应该如何重构,以使“评论”不必对 People 了解太多?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2013-08-02
  • 2011-02-21
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多