在常见的Ruby on Rails 3/4应用程序中,创建模型后有两种方法来传递邮件:
1)直接从控制器的create动作发送邮件
#listings_controller.rb
def create
@listing.create(params[:listing])
if @listing.save
ListingMailer.new_listing_notice(@listing).deliver
format.html {redirect_to @listing}
...
end
end
或2)通过模型回调发送邮件
#listing.rb
class Listing
after_create :notify
...
def notify
ListingMailer.new_listing_notice(self).deliver
end
end
对于哪种方法更好,目前是否存在共识?从控制器发送可提供更多控制权,但是如果始终发送邮件,是否有任何理由不使用回调?这主要是风格问题,还是还有其他重要问题?
通常,维护after_*
模型中具有钩子的代码要困难得多。当然,在某些情况下,使用回调是非常合理的(例如,在某些应用程序中应始终执行计算校验和的操作),但是这些情况是该规则的例外。
在您的电子邮件示例中,以下是回调方法的缺点:
例如,您希望使用特殊队列发送电子邮件。与队列进行通信的接口无论如何都不会影响构建清单模型的方式。
电子邮件只是与外界互动的一种方式。并非总是需要将所有业务逻辑都与外界联系在一起。呼吸暂停提到的例子之一就是进口。另一个示例是控制台界面(在使用Rails控制台玩游戏时,是否要发送电子邮件?)
这更多是1和2的结果,但是after
随着时间的流逝,测试挂钩变得越来越困难。测试Listing模型时需要模拟邮件程序,这使得测试不清楚,并且每当发生更改时就更难以维护。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句