胖模型瘦身控制器

“Fat Model,Skinny Controller”指的是 MVC 的 M 和 C 部分如何理想地协同工作。也就是说,任何与非响应相关的逻辑都应该放在模型中,理想情况下是一个很好的,可测试的方法。同时,控制器只是视图和模型之间的一个很好的接口。

在实践中,这可能需要一系列不同类型的重构,但这一切都归结为一个想法:通过移动任何与模型(而不是控制器)的响应无关的逻辑,不仅促进了重用在可能的情况下,你也可以在请求的上下文之外测试代码。

让我们看一个简单的例子。假设你有这样的代码:

def index
  @published_posts = Post.where('published_at <= ?', Time.now)
  @unpublished_posts = Post.where('published_at IS NULL OR published_at > ?', Time.now)
end

你可以将其更改为:

def index
  @published_posts = Post.published
  @unpublished_posts = Post.unpublished
end

然后,你可以将逻辑移动到帖子模型,它可能如下所示:

scope :published, ->(timestamp = Time.now) { where('published_at <= ?', timestamp) }
scope :unpublished, ->(timestamp = Time.now) { where('published_at IS NULL OR published_at > ?', timestamp) }