Ruby on Rails Modelo gordo, flaco controlador


Ejemplo

"Modelo gordo, controlador delgado" se refiere a cómo las partes M y C de MVC trabajan idealmente juntas. Es decir, cualquier lógica no relacionada con la respuesta debe ir en el modelo, idealmente en un método agradable y comprobable. Mientras tanto, el controlador "delgado" es simplemente una interfaz agradable entre la vista y el modelo.

En la práctica, esto puede requerir un rango de diferentes tipos de refactorización, pero todo se reduce a una idea: al mover cualquier lógica que no sea sobre la respuesta al modelo (en lugar del controlador), no solo ha promovido la reutilización siempre que sea posible, pero también ha hecho posible probar su código fuera del contexto de una solicitud.

Veamos un ejemplo simple. Digamos que tienes un código como este:

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

Puedes cambiarlo a esto:

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

Luego, puede mover la lógica a su modelo de publicación, donde podría verse así:

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