在Rails中创建新模型实例时发送电子邮件的最佳方式?

时间:2010-01-30 19:16:39

标签: ruby-on-rails email model callback observer-pattern

我的应用包含以下型号:UserTaskAssignment。每个作业belongs_to用户和任务(换句话说,任务通过作业分配给用户)。

用户完成任务后,分配将标记为完成,应用程序会立即创建新分配(或者换句话说,将任务分配给其他人)。

创建此新作业后,我想立即向新受让人发送电子邮件。我知道我可以通过以下三种方式之一做到这一点:

  1. 在我的控制器中明确发送电子邮件。
  2. 在分配模型的回调中发送电子邮件。
  3. 在分配模型上创建观察者,并在after_create
  4. 中发送电子邮件

    人们认为哪种选择最好,为什么? #1对我来说似乎很糟糕,因为我不想记得在每个可能完成作业的动作中发送它。我听说有几个人说Rails观察员很糟糕,应该避免,但我不确定他们是不是我应该信任的人。还有其他意见吗?

4 个答案:

答案 0 :(得分:3)

你是对的,第一种方式不是一个好方法。由于一些原因,观察者是我的首选方式。

首先,如果您使用TDD(测试驱动开发),您可以关闭观察者以更纯粹地测试模型,而不会在每次创建时触发邮件程序创建。然后你可以单独测试邮件和观察者。

其次,分离回调的想法可以创建更清晰的代码。回调并不是模型的一部分,它们是事件。您的模型包含运行自身所需的函数和属性,回调(由观察者实现)是单独的事件处理程序。

那就是说,我不认为你的第二个选择是“坏”或不那么专业。无论哪种方式都可以在模型级别工作,而不是控制器或(甚至更糟糕的)视图。

答案 1 :(得分:1)

我会选择观察者,因为它们可以减少模型/控制器代码中的混乱,我可以认为使用它们没有任何缺点......

iirc在保存电子邮件后发送电子邮件甚至是活动记录观察员文档中的一个示例

答案 2 :(得分:0)

你也可以做一些事情。您可以将观察者用于一个操作,如果只有一个电子邮件用于另一个操作,则可以使用选项#1。

您是否听说过acts_as_state_machine或任何其他类似解决方案?

http://github.com/rubyist/aasm

它们允许您定义每个对象的状态以及状态更改时可能发生的不同事情。

如果您需要这么多,这可以让您在发送内容时拥有所需的逻辑。可能是矫枉过正,但可以非常方便。我建议,因为您希望在任务“完成”时发送电子邮件,这听起来可能是您的任务模型中的一种状态或状态列。

答案 3 :(得分:0)

最后,我喜欢这个实现http://www.scottw.com/resque-mail-queue-gem