胖模型瘦身控制器

“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) }