Bourgeois is a Ruby library that makes using presenters a very simple thing.
Installation
Add this line to your application’s Gemfile:
gem 'bourgeois'
And then execute:
$ bundle
Usage
Create an app/presenters
directory and put some presenters in it:
# app/presenters/user_presenter.rb
class UserPresenter < Bourgeois::Presenter
def formatted_name
"#{first_name} #{last_name}".strip
end
end
Then, you can use the present
helper in your views to wrap ActiveModel
(and ActiveRecord
) objects around a presenter:
<% present User.first do |user| %>
<p>This is <%= user.formatted_name %></p>
<% end %>
Methods that aren’t in the presenter (first_name
and last_name
) are delegated to the presented object. You can also use the view
method in the presenter to get the original view it was called in:
# app/presenters/user_presenter.rb
class UserPresenter < Bourgeois::Presenter
def birthdate
# To get the original `birthdate` value, you can either use `super` or `object.birthdate`
super.presence || view.content_tag(:em, 'Unknown')
end
end
Custom block helpers
You can use the simple helper
DSL to define block helpers that will be executed if certain
conditions are matched.
class UserPresenter < Bourgeois::Presenter
helper :with_profile, if: -> { profile.present? && profile.public? }
end
User.first.profile = Profile.create(public: true, title: 'Foo', description: 'Bar')
<% present User.first do |user| %>
<h1><%= user.full_name %></h1>
<% user.with_profile do %>
<div class="profile">
<h2><%= user.profile.title %></h2>
<%= simple_format(user.profile.description) %>
</div>
<% end %>
<% end %>
Inspiration
Bourgeois was inspired by some code @rafBM wrote for his OpenCode talk on May 28th, 2013.
License
Bourgeois
is © 2013-2015 Mirego and may be freely distributed under the New BSD license. See the LICENSE.md
file.
About Mirego
Mirego is a team of passionate people who believe that work is a place where you can innovate and have fun. We're a team of talented people who imagine and build beautiful Web and mobile applications. We come together to share ideas and change the world.
We also love open-source software and we try to give back to the community as much as we can.