Ruby on Rails 胖模型,瘦控制器
示例
“胖模型,瘦控制器”是指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) }