Ruby on Rails Fettes Modell, dünner Controller


Beispiel

„Fat Model, Skinny Controller“ bezieht sich darauf, wie die M- und C-Teile von MVC ideal zusammenarbeiten. Jede nicht-antwortbezogene Logik sollte in das Modell aufgenommen werden, idealerweise in einer schönen, überprüfbaren Methode. Inzwischen ist der "Skinny" Controller einfach eine schöne Schnittstelle zwischen Ansicht und Modell.

In der Praxis kann dies eine Reihe verschiedener Arten von Refactoring erfordern, aber es kommt auf eine Idee: Durch das Verschieben einer beliebigen Logik, die nicht die Reaktion auf das Modell (anstelle des Controllers) ist, haben Sie nicht nur die Wiederverwendung befördert wo möglich, aber Sie haben es auch ermöglicht, Ihren Code außerhalb des Kontexts einer Anfrage zu testen.

Schauen wir uns ein einfaches Beispiel an. Angenommen, Sie haben folgenden Code:

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

Sie können es so ändern:

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

Dann können Sie die Logik in Ihr Post-Modell verschieben, wo es wie folgt aussehen könnte:

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