Ruby on Rails 胖模型,瘦瘦的控制器


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