Ruby on Rails Vet model, magere controller


Voorbeeld

"Fat Model, Skinny Controller" verwijst naar hoe de M- en C-delen van MVC idealiter samenwerken. Elke niet-responsgerelateerde logica moet namelijk in het model worden opgenomen, idealiter in een mooie, testbare methode. Ondertussen is de 'skinny' controller gewoon een mooie interface tussen het beeld en het model.

In de praktijk kan dit een aantal verschillende soorten refactoring vereisen, maar het komt allemaal neer op één idee: door elke logica te verplaatsen die niet gaat over de reactie op het model (in plaats van de controller), heb je niet alleen hergebruik gepromoot waar mogelijk, maar u hebt het ook mogelijk gemaakt om uw code buiten de context van een verzoek te testen.

Laten we eens kijken naar een eenvoudig voorbeeld. Stel dat u deze code hebt:

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

U kunt dit als volgt wijzigen:

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

Vervolgens kunt u de logica naar uw postmodel verplaatsen, waar deze er mogelijk als volgt uitziet:

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