По мотивам Ruby on Rails – Presenters & decorators
Презентер
С прогрессом проекта шаблоны становятся сложнее, там появляется нетривиальная логика. И конечно же контроллеры тоже разрастаются. Существует такой паттерн проектирования приложений – presenter (презентер). Это модуль который знает о модели и шаблоне.
Пример простого контроллера и шаблона, до внедрения презентера.
Контроллер
|
def index @posts = Post.all @authors = Author.all @post_published_count = Post.published_count # - это скоуп Post.published_count end |
Модель
|
class Post < ActiveRecord::Base belongs_to :author scope :published_posts_count, -> {all.count} end |
Шаблон
|
<p> Всего опубликовано: <%= @post_published_count %> </p> <%= @authors # проход по массиву и отображение%> |
Внедрение презентера простое в папку App
– добавьте папку presenters/post
, файл index_presenter.rb
Содержимое презентера предельно простое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
module Posts class IndexPresenter # здесь как раз и разбивается логика шаблона и контроллера, # перенесите сюда логику из контроллеров def posts Posts.all end def authors Authors.all end def post_published_count Post.published_count end end end |
Обновлённый контроллер
|
def index @presenter = Posts::IndexPresenter.new end |
Обновлённый шаблон
|
<p> Всего опубликовано: <%= @presenter.published_count %> </p> <%= @presenter.authors # проход по массиву и отображение%> |
Другими словами, вся логика относящаяся к шаблону выделена из контроллера в отдельный модуль, который легче поддерживать и использовать.