【问题标题】:Best practices for coding in controller and models?在控制器和模型中编码的最佳实践?
【发布时间】:2012-08-11 14:34:55
【问题描述】:

我有这个简短的代码,用于在有人在他的帖子上出现时向用户发送电子邮件通知。我关心的是这个sn-p的位置。

if user.settings.enabled_notifications && some_other_conditions
    NotificationMailer.notify_topic_owner(comment,owner)
end

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

基本上,some_other_conditions 包含一些 3-4 个条件来评估为真以便发送邮件。很明显,控制器不是此代码的正确位置(我在某处读到控制器代码应该轻巧干净)。 我不认为我可以将此 sn-p 移动到助手,因为助手包含视图代码。同样,模型看起来也不正确,因为代码实际上与模型无关(或者是吗?)。

我要为这个简短的 sn-p 创建一个新模块吗?展望未来,如果您还可以讲述最佳实践或针对此类沉闷困惑的一些参考,我将不胜感激。我发现自己经常为此苦苦挣扎!

【问题讨论】:

  • 这是切题的,但您可能有兴趣阅读Law of Demeter;我还发现 Destroy All Software 是一个很棒的截屏视频系列,里面有很多很棒的建筑视频。
  • 看起来是一组不错的截屏视频,感谢 Brandon!

标签: ruby-on-rails model-view-controller


【解决方案1】:

您提出了正确的问题。为什么不更进一步,尝试做一些 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

【讨论】:

  • +1;对象/类不必继承自 ActiveRecord::Base 即可成为模型。
【解决方案2】:

我看不出将它放在控制器中会有什么问题。如果它与控制器中的方法有关,它肯定可以去那里。如果在保存后调用它,您可能可以将其移动到模型中。

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

【讨论】:

    【解决方案3】:

    我用来考虑它的惯例是:“是否应该每次发送邮件,无论通过什么操作添加评论?”。考虑一下,如果将来您实施了一个添加 cmets 的自动化系统,那么是否应该在这种情况下发送邮件。如果是这样,它可能是模型代码;否则,与添加注释的方式有关,是控制器代码。

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多