gpt4 book ai didi

ruby-on-rails - Rails Mailer 最佳实践 - Controller 或 after_create 回调?

转载 作者:行者123 更新时间:2023-12-03 23:44:00 27 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

7年前关闭。




Improve this question




在常见的 Ruby on Rails 3/4 应用程序中,在创建模型后有两种发送邮件的选项:

1) 直接从 Controller 的创建 Action 发送邮件

#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

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

最佳答案

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

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

邮件界面和列表模型因不同的原因而改变(Single Responsibility Principle)。

例如,您希望使用特殊队列发送电子邮件。与队列通信的接口(interface)不应该以任何方式影响列表模型的构建方式。

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

电子邮件只是与外界互动的一种方式。并非所有的业务逻辑都需要与外部世界联系起来。示例之一,如 apneadiving提到的是进口。另一个例子是控制台界面(您想在使用 rails 控制台时收到电子邮件吗?)

测试很困难。

这更多是 1 和 2 的结果,但测试 after随着时间的推移,钩子(Hook)变得越来越困难。在测试列表模型时需要模拟邮件程序,这使得测试变得不清楚,并且在发生变化时更难以维护。

关于ruby-on-rails - Rails Mailer 最佳实践 - Controller 或 after_create 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23797799/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com