Rails Mailer最佳实践-控制器还是after_create回调?

埃里克·卡斯特曼(Erik Kastman)

在常见的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

对于哪种方法更好,目前是否存在共识?从控制器发送可提供更多控制权,但是如果始终发送邮件,是否有任何理由不使用回调?这主要是风格问题,还是还有其他重要问题?

伊万·扎里亚(Ivan Zarea)

通常,维护after_*模型中具有钩子的代码要困难得多当然,在某些情况下,使用回调是非常合理的(例如,在某些应用程序中应始终执行计算校验和的操作),但是这些情况是该规则的例外。

在您的电子邮件示例中,以下是回调方法的缺点:

邮件程序界面和列表模型由于不同的原因而发生变化(单一职责原则)。

例如,您希望使用特殊队列发送电子邮件。与队列进行通信的接口无论如何都不会影响构建清单模型的方式。

您的应用程序不需要一直发送电子邮件。

电子邮件只是与外界互动的一种方式。并非总是需要将所有业务逻辑都与外界联系在一起。呼吸暂停提到的例子之一就是进口。另一个示例是控制台界面(在使用Rails控制台玩游戏时,是否要发送电子邮件?)

测试很困难。

这更多是1和2的结果,但是after随着时间的流逝,测试挂钩变得越来越困难。测试Listing模型时需要模拟邮件程序,这使得测试不清楚,并且每当发生更改时就更难以维护。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rails Mailer最佳实践-控制器还是after_create回调?

来自分类Dev

Rails最佳实践:在单个控制器中处理多个关系

来自分类Dev

用于多用途模型的Rails控制器的最佳实践

来自分类Dev

Rails 4-最佳实践-如何显示来自不同控制器的数据的视图?

来自分类Dev

Rails环境最佳实践

来自分类Dev

Angular最佳实践:在工厂还是在控制器中承诺?

来自分类Dev

Rails回调中after_create,after_save和after_commit之间的区别

来自分类Dev

Rails AngularJS多态最佳实践

来自分类Dev

Ruby on Rails DRY最佳实践

来自分类Dev

Rails AngularJS多态最佳实践

来自分类Dev

在Rails中替代after_create回调的优雅替代品?

来自分类Dev

Rails FactoryGirl特征与模型after_create回调的关联未设置vanity_url

来自分类Dev

AngularJS控制器功能最佳实践

来自分类Dev

木偶控制器最佳实践

来自分类Dev

AngularJS 控制器的最佳实践

来自分类Dev

Rails最佳实践:手动添加Java脚本还是使用gem?

来自分类Dev

Ruby on Rails-“胖模型,瘦控制器”实践

来自分类Dev

Rails前端的最佳实践是什么?

来自分类Dev

Rails最佳实践,使用多态关联

来自分类Dev

Rails API最佳实践,JSON响应

来自分类Dev

渲染查询最佳实践Rails 4.0

来自分类Dev

Rails使用布局的最佳实践

来自分类Dev

RESTFUL路由的最佳实践URL for Rails

来自分类Dev

Ruby on Rails中的跟踪活动最佳实践

来自分类Dev

Rails前端的最佳实践是什么?

来自分类Dev

“拆分”大型Rails控制器的最佳方法

来自分类Dev

Rails:after_create回调上的delay_job?

来自分类Dev

Swift iOS最佳实践REST回调

来自分类Dev

函数设计接受回调最佳实践