Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 控制器和模型中编码的最佳实践?_Ruby On Rails_Model View Controller - Fatal编程技术网

Ruby on rails 控制器和模型中编码的最佳实践?

Ruby on rails 控制器和模型中编码的最佳实践?,ruby-on-rails,model-view-controller,Ruby On Rails,Model View Controller,我有一个简短的代码,当有人对他的帖子发表评论时,可以向用户发送电子邮件通知。我关心的是这个片段的位置 if user.settings.enabled_notifications && some_other_conditions NotificationMailer.notify_topic_owner(comment,owner) end notify\u topic\u owner()只需根据传递给它的参数拍摄邮件即可 基本上,some_other_条件包含一些要计

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

if user.settings.enabled_notifications && some_other_conditions
    NotificationMailer.notify_topic_owner(comment,owner)
end
notify\u topic\u owner()
只需根据传递给它的参数拍摄邮件即可

基本上,
some_other_条件
包含一些要计算为true的3-4个条件,以便发送邮件。很明显,控制器不是这个代码的合适位置(我在某个地方读到控制器代码应该是轻巧干净的)。 我认为我无法将此代码段移动到帮助程序,因为帮助程序包含视图的代码。同样,模型看起来也不正确,因为代码实际上与模型无关(或者是吗?)


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

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


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

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


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

你问的问题是对的。为什么不更进一步,尝试执行一些OOP: (下面的代码并不理想,但它应该能让您很好地了解如何使用它)。我没有考虑“一些其他条件”,因为这些条件可能是您最了解的,适合您的域逻辑

# 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(当前用户)。topic(你好世界)。将来,你评论的
主题
可以发送短信、烟雾信号、打印、写入数据库等,而无需在许多地方更改呼叫代码lke
NotificationMailer.xxxx

你问的问题是正确的。为什么不更进一步,尝试执行一些OOP: (下面的代码并不理想,但它应该能让您很好地了解如何使用它)。我没有考虑“一些其他条件”,因为这些条件可能是您最了解的,适合您的域逻辑

# 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(当前用户)。topic(你好世界)。将来,你评论的
主题可以发送短信、烟雾信号、打印、写入数据库等,而无需在许多地方更改呼叫代码lke
NotificationMailer.xxxx

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

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

+1;对象/类不必从
ActiveRecord::Base
继承即可成为模型;对象/类不必从
ActiveRecord::Base
继承就可以成为模型;我还发现这是一个很棒的视频系列,里面有很多关于建筑的精彩视频。看起来像是一组很好的视频,谢谢布兰登!这是无关紧要的,但你可能有兴趣在网上阅读;我还发现这是一个很棒的视频系列,里面有很多关于建筑的精彩视频。看起来像是一组很好的视频,谢谢布兰登!