0.0
No release in over 3 years
Low commit activity in last 3 years
Presenter helps you expose view models to your views with a declarative approach.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

 Project Readme

Presenter Gem Version Build Status Test Coverage License

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.