Presenter helps you expose view models to your views in a convenient way, while still allowing you to define methods with the same name inside your controllers.
# app/controllers/people_controller.rb
class PeopleController < ApplicationController
present(:person) {
PersonDecorator.decorate(person)
}
...
def person
People.find(params[:id])
end
end
/ app/views/people/show.html.haml
.person
.person-name= person.name
.person-info= person.biography
The method is also available in the controller, with a _presenter
suffix:
# app/controllers/people_controller.rb
class PeopleController < ApplicationController
present(:person) {
PersonDecorator.decorate(person)
}
def update
person.update(attrs)
redirect_to person_presenter.path, notice: "Successfully updated."
end
...
end
Background
Presenter attempts to simplify the exposure of variables to the views. It doesn't really care about what you are exposing, although it's specially useful to implement two-step views while using view models in combination with resourcerer.
How it works
When you provide a block, it defines a "#{name}_presenter"
private method in your controller.
After that, it creates a helper method for your views, which calls the "#{name}_presenter"
counterpart in the controller.
Memoization
Each presenter method is memoized, so the method is called only once and your views get the same instance every time. The block is evaluated only if the method is called.
Corolary
Since the helper methods defined are only available for the view, you can define methods with the same name in your controller 😃
Credits
Presenter was crafted to use in combination with resourcerer.