Ruby on Rails Model tłuszczu, chudy kontroler


Przykład

„Gruby model, chudy kontroler” odnosi się do idealnej współpracy części M i C MVC. Mianowicie, każda logika niezwiązana z odpowiedzią powinna iść w modelu, najlepiej w ładnej, sprawdzalnej metodzie. Tymczasem „chudy” kontroler to po prostu ładny interfejs między widokiem a modelem.

W praktyce może to wymagać szeregu różnych rodzajów refaktoryzacji, ale wszystko sprowadza się do jednego pomysłu: przesuwając dowolną logikę, która nie dotyczy odpowiedzi na model (zamiast kontrolera), nie tylko promujesz ponowne użycie tam gdzie to możliwe, ale umożliwiłeś także przetestowanie kodu poza kontekstem żądania.

Spójrzmy na prosty przykład. Powiedz, że masz taki kod:

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

Możesz to zmienić na to:

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

Następnie możesz przenieść logikę do swojego modelu postu, gdzie może to wyglądać tak:

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