【问题标题】:Best way to send an email upon creation of a new model instance in Rails?在 Rails 中创建新模型实例时发送电子邮件的最佳方式是什么?
【发布时间】:2011-01-11 06:18:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    也就是说,我不认为您的第二个选项“不好”或不够专业。只要是在模型级别,而不是控制器或(更糟糕的)视图,这两种方法都可以工作。

    【讨论】:

    • TDD 是使用 Observers 的绝佳理由。除非有人提出更令人信服的观点,否则我会尽快检查您。
    【解决方案2】:

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

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

    【讨论】:

    • 是的,我看到了,这也是我问的原因之一。但是,有几个人告诉我要避免使用观察者,所以我只是想获得更多的意见。
    • 如果观察者有任何问题,我也会感兴趣!
    • 他们给出的原因是没有任何东西直接引用观察者,所以看代码的新人可能不会注意到它们。对我来说,这似乎是一个有点软弱的理由,更能说明开发人员的 Rails 知识存在漏洞,而不是糟糕的代码气味,但我仍然想听听那些比我更有经验的人的意见。
    • 可以肯定的是,observer.rb 位于模型目录中的 model.rb 旁边。
    • 是的,我就是这么想的。
    【解决方案3】:

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

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

    http://github.com/rubyist/aasm

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

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

    【讨论】:

    • 这看起来很酷,我一定会记住的。但就目前而言,这绝对是矫枉过正。不过还是谢谢。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2018-02-21
      • 1970-01-01
      • 2011-06-18
      • 2014-08-19
      相关资源
      最近更新 更多