0

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

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

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

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

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

4

3 回答 3

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可以发送短信、烟雾信号、打印、写入数据库等,而无需您NotificationMailer.xxxx在许多地方更改调用代码。

于 2012-08-11T06:28:11.233 回答
1

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

于 2012-08-11T06:31:14.453 回答
1

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

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

于 2012-08-11T06:26:49.473 回答