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

8
我有一个应用程序,其中包含以下模型:UserTaskAssignment。每个Assignmentbelongs_to一个User和一个Task(或者换句话说,通过Assignment将任务分配给用户)。
当用户完成任务后,Assignment标记为已完成,然后应用程序立即创建新的Assignment(或者换句话说,将任务分配给其他人)。
在创建这个新的Assignment之后,我想立即向新的受让人发送电子邮件。我知道有三种方法可以做到这一点:
  1. 在我的控制器中显式发送电子邮件。
  2. Assignment模型的回调函数中发送电子邮件。
  3. after_create中创建Assignment模型观察器并发送电子邮件。
哪个选项是最好的,为什么呢?#1 对我来说似乎不好,因为我不想在可能完成Assignment的每个操作中都记得发送它。我听过一些人说Rails观察器很糟糕,应该避免使用它们,但我不确定他们是否值得信任。还有其他的意见吗?
4个回答

3

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

首先,如果你使用TDD(测试驱动开发),你可以关闭观察者以更纯粹地测试模型,而不是每个创建都触发邮件创建。然后你可以单独对邮件和观察者进行单元测试。

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

话虽如此,我认为你的第二个选项并不“糟糕”或不够专业。只要在模型层级别上,而不是控制器或(更糟糕的是)视图,任何一种方式都可以工作。


TDD这个东西是使用观察者的绝佳理由。除非有更具有说服力的观点,否则我很快就会勾选你。 - jakeboxer

1
我会选择使用观察者模式,因为它可以减少模型/控制器代码的混乱,并且在使用它们时,我想不到任何缺点...
如果我没记错的话,在Active Record Observers文档中甚至有一个在保存后发送电子邮件的示例。

是的,我看到了,这也是我问的原因之一。然而,有几个人告诉我要避免使用观察者模式,所以我只是想听听更多的意见。 - jakeboxer
如果观察者有任何问题,我也会感兴趣! - roman
他们给出的理由是因为没有直接引用观察者,所以新人看代码时可能不会注意到它们。对我来说,这似乎是一个相对较弱的理由,更表明开发者在Rails知识方面存在缺陷,而不是糟糕的代码味道,但我仍然想听听比我更有经验的人的意见。 - jakeboxer
要确定,observer.rb 位于 models 目录中紧邻 model.rb 的位置。 - Eric
是的,这正是我所想的。 - jakeboxer

0

你也可以进行多种组合。对于某个操作,你可以使用观察者模式,而如果只有一个电子邮件的情况下,你可以使用选项#1。

你听说过acts_as_state_machine或其他类似的解决方案吗?

http://github.com/rubyist/aasm

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

这使您可以拥有所需的任何逻辑,了解何时发送事物,如果您需要的话。 这可能有些过度,但确实非常方便。 我建议,因为当任务“完成”时需要发送电子邮件,这听起来可能是您的Task模型中的某种状态或状态列。


这看起来很酷,我一定会记在心里。但目前来说,它绝对是过度杀伤力的。还是谢谢你。 - jakeboxer

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接