我有这个简短而简单的代码,当有人对他的帖子发表评论时,可以发送电子邮件通知给用户。我关心的是这个代码片段的位置。
if user.settings.enabled_notifications && some_other_conditions
NotificationMailer.notify_topic_owner(comment,owner)
endnotify_topic_owner()只是根据传递给它的参数发送一封邮件。
基本上,some_other_conditions包含一些3-4个条件,这些条件将被评估为true,以便发送邮件。所以很明显,控制器不是存放这些代码的合适地方(我在某处读到控制器代码应该是轻量级的、干净的)。我不认为我可以将这个代码片段移动到一个帮助程序中,因为帮助程序包含视图的代码。同样,模型看起来也不正确,因为代码实际上并不是关于模型的(或者是吗?)。
我要为这个简短的代码片段创建一个新的模块吗?展望未来,如果您也能告诉我一些关于这种无聊的困惑的最佳实践或一些参考,我将不胜感激。我发现自己经常为此而苦苦挣扎!
发布于 2012-08-11 14:26:49
我看不出把这个放在控制器里有什么错。如果它与你的控制器中的一个方法相关,那么它绝对可以放在那里。如果它是在保存之后调用的,那么您可以将其移动到模型中。
一般来说,我认为最好的做法是尝试将尽可能多的东西放入模型和类中。将控制器保存为特定于控制器的代码,并且帮助器应该只包含与在视图中呈现内容相关的代码。很多时候,我会将代码放在控制器中,并在重构时将其移动到模型中。不管怎样,我的观点是:)
发布于 2012-08-11 14:28:11
你问的问题是对的。为什么不更进一步,尝试做一些OOP:(下面的代码不是理想的,但它应该能让你很好地了解如何实现它)。我没有考虑"some_other_conditions“,因为它们可能是您最熟悉的东西,它将适合您的域逻辑。
# A class for notification. I usually avoid depending directly on xxxMailer and similar
class Notifier
# Inject the recipient
def initialize(recipient)
@recipient = recipient
end
def topic_commented(comment)
# Only let Notifier know that NotificationMailer exists. (not perfect OOP. could inject this too)
NotificationMailer.notify_topic_owner(comment,@recipient) if @recipient.notifications_enabled? # Ideally should be telling, not asking. Oh well.
end
end
class User
# Sprinkling of Law of Demeter
def notifications_enabled?
settings.enabled_notifications
end
end你打电话给Notifier.new(current_user).topic_commented("Hello World")。在未来,topic_commented可以发送短信,烟雾信号,打印,写入数据库等,所有这些都不需要你在许多地方更改调用代码,如NotificationMailer.xxxx。
发布于 2012-08-11 14:31:14
我用来思考它的惯例是:“是否应该在每次添加评论时都发送邮件,而不管是通过什么操作?”想一想,如果将来你实现了一个自动添加评论的系统,在这种情况下是否应该发送邮件。如果是这样,它可能是模型代码;否则,它与添加注释的方式以及控制器代码有关。
https://stackoverflow.com/questions/11912116
复制相似问题