7

我有一个具有以下型号的应用程序:UserTaskAssignment。每个分配belongs_to一个用户和一个任务(或者换句话说,一个任务通过一个分配分配给一个用户)。

一旦用户完成了一项任务,该任务就会被标记为完成,并且应用程序会立即创建一个新任务(或者换句话说,将任务分配给其他人)。

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

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

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

4

4 回答 4

3

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

首先,如果您使用 TDD(测试驱动开发),您可以关闭观察者以更纯粹地测试模型,而无需每次创建都会触发邮件程序创建。然后您可以分别对邮件程序和观察者进行单元测试。

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

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

于 2010-01-30T19:30:10.363 回答
1

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

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

于 2010-01-30T19:26:46.173 回答
0

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

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

http://github.com/rubyist/aasm

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

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

于 2010-01-30T19:28:12.507 回答
0

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

于 2011-09-14T08:03:21.403 回答