首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在控制器和模型中编码的最佳实践?

在控制器和模型中编码的最佳实践?
EN

Stack Overflow用户
提问于 2012-08-11 13:13:45
回答 3查看 149关注 0票数 0

我有这个简短而简单的代码,当有人对他的帖子发表评论时,可以发送电子邮件通知给用户。我关心的是这个代码片段的位置。

代码语言:javascript
运行
复制
if user.settings.enabled_notifications && some_other_conditions
    NotificationMailer.notify_topic_owner(comment,owner)
end

notify_topic_owner()只是根据传递给它的参数发送一封邮件。

基本上,some_other_conditions包含一些3-4个条件,这些条件将被评估为true,以便发送邮件。所以很明显,控制器不是存放这些代码的合适地方(我在某处读到控制器代码应该是轻量级的、干净的)。我不认为我可以将这个代码片段移动到一个帮助程序中,因为帮助程序包含视图的代码。同样,模型看起来也不正确,因为代码实际上并不是关于模型的(或者是吗?)。

我要为这个简短的代码片段创建一个新的模块吗?展望未来,如果您也能告诉我一些关于这种无聊的困惑的最佳实践或一些参考,我将不胜感激。我发现自己经常为此而苦苦挣扎!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-11 14:26:49

我看不出把这个放在控制器里有什么错。如果它与你的控制器中的一个方法相关,那么它绝对可以放在那里。如果它是在保存之后调用的,那么您可以将其移动到模型中。

一般来说,我认为最好的做法是尝试将尽可能多的东西放入模型和类中。将控制器保存为特定于控制器的代码,并且帮助器应该只包含与在视图中呈现内容相关的代码。很多时候,我会将代码放在控制器中,并在重构时将其移动到模型中。不管怎样,我的观点是:)

票数 1
EN

Stack Overflow用户

发布于 2012-08-11 14:28:11

你问的问题是对的。为什么不更进一步,尝试做一些OOP:(下面的代码不是理想的,但它应该能让你很好地了解如何实现它)。我没有考虑"some_other_conditions“,因为它们可能是您最熟悉的东西,它将适合您的域逻辑。

代码语言:javascript
运行
复制
# 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

票数 3
EN

Stack Overflow用户

发布于 2012-08-11 14:31:14

我用来思考它的惯例是:“是否应该在每次添加评论时都发送邮件,而不管是通过什么操作?”想一想,如果将来你实现了一个自动添加评论的系统,在这种情况下是否应该发送邮件。如果是这样,它可能是模型代码;否则,它与添加注释的方式以及控制器代码有关。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11912116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档