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

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

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

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

  • 在我的控制器中显式发送电子邮件。
  • 在Assignment模型的回调中发送电子邮件。
  • 在Assignment模型上创建观察者并在after_create发送电子邮件。
  • 人们认为哪种选择最好,为什么? #1对我来说似乎不好,因为我不想记住在每个可能完成作业的动作中发送它。 我听说有几个人说Rails的观察者很糟糕,应该避免,但我不确定他们是不是我应该信任的人。 还有其他意见吗?


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

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

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

    也就是说,我不认为你的第二选择是“坏”或不太专业。 无论哪种方式,只要它处于模型级别,而不是控制器或(更糟糕的)视图。


    我会去观察员,因为他们减少你的模型/控制器代码中的混乱,我可以想到没有使用它们的缺点...

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


    你也可以做一些事情的组合。 您可以使用观察员进行一项操作,如果只有一封电子邮件用于其他一项操作,则可以使用选项#1进行操作。

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

    http://github.com/rubyist/aasm

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

    这允许您在事情发送时拥有尽可能多的逻辑,如果您需要这些。 可以矫枉过正,但可以非常方便。 我建议,因为你想在任务完成时发送一封电子邮件,这听起来好像它可能是任务模型中的一种状态或状态列。

    链接地址: http://www.djcxy.com/p/44349.html

    上一篇: Best way to send an email upon creation of a new model instance in Rails?

    下一篇: Accessing Microsoft.Win32.UnsafeNativeMethods?