胖模型瘦身控制器
“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) }