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

时间:2012-08-11 05:13:45

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

我有这个简短的代码,用于在有人评论他的帖子时向用户发送电子邮件通知。我关心的是这个片段的位置。

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

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

基本上,some_other_conditions包含要评估为true的3-4个条件以便发送邮件。很明显,控制器不是这个代码的正确位置(我在某处读到控制器代码应该轻巧而干净)。 我不认为我可以将这个片段移动到帮助器,因为助手包含视图代码。同样,模型看起来不正确,因为代码不是真正关于模型(或者是它?)。

我是否为这个简短的片段制作了一个新模块?展望未来,我真的很感激,如果你也可以告诉最佳实践或一些参考这种沉闷的混淆。我发现自己经常在这方面苦苦挣扎!

3 个答案:

答案 0 :(得分:3)

你在问正确的问题。为什么不进一步尝试做一些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可以发送短信,烟雾信号,打印,写入数据库等,而无需在许多地方更改呼叫代码lke NotificationMailer.xxxx

答案 1 :(得分:1)

我不知道将它放在控制器中会出现什么问题。如果它与你控制器中的方法有关,它绝对可以去那里。如果在保存之后调用它,您可以将其移动到模型中。

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

答案 2 :(得分:1)

我用来考虑它的惯例是:"邮件是否应该每次发送添加评论,无论采取什么行动?"。考虑一下,如果您将来实施添加评论的自动化系统,是否应该在这种情况下发送邮件。如果是这样,它可能是模型代码;否则,它与评论的添加方式及其控制器代码有关。