<p align="center">
  <a href="https://github.com/mirego/bourgeois">
    <img src="http://i.imgur.com/Z8ja8Wz.png" alt="Bourgeois" />
  </a>
  <br />
  Bourgeois is a Ruby library that makes using presenters a very simple thing.
  <br /><br />
  <a href="https://rubygems.org/gems/bourgeois"><img src="http://img.shields.io/gem/v/bourgeois.svg" /></a>
  <a href="https://codeclimate.com/github/mirego/bourgeois"><img src="http://img.shields.io/codeclimate/github/mirego/bourgeois.svg" /></a>
  <a href='https://coveralls.io/r/mirego/bourgeois?branch=master'><img src="http://img.shields.io/coveralls/mirego/bourgeois.svg" /></a>
  <a href='https://gemnasium.com/mirego/bourgeois'><img src="http://img.shields.io/gemnasium/mirego/bourgeois.svg" /></a>
  <a href="https://travis-ci.org/mirego/bourgeois"><img src="http://img.shields.io/travis/mirego/bourgeois.svg" /></a>
</p>

---

## Installation

Add this line to your application’s Gemfile:

```ruby
gem 'bourgeois'
```

And then execute:

```bash
$ bundle
```

## Usage

Create an `app/presenters` directory and put some presenters in it:

```ruby
# 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:

```erb
<% 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:

```ruby
# 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.

```ruby
class UserPresenter < Bourgeois::Presenter
  helper :with_profile, if: -> { profile.present? && profile.public? }
end

User.first.profile = Profile.create(public: true, title: 'Foo', description: 'Bar')
```

```erb
<% 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](https://twitter.com/rafBM) wrote for [his OpenCode talk](https://github.com/rafBM/opencode12-rails) on May 28th, 2013.

## License

`Bourgeois` is © 2013-2014 [Mirego](http://www.mirego.com) and may be freely distributed under the [New BSD license](http://opensource.org/licenses/BSD-3-Clause).  See the [`LICENSE.md`](https://github.com/mirego/bourgeois/blob/master/LICENSE.md) file.

## About Mirego

[Mirego](http://mirego.com) 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](http://life.mirego.com) who imagine and build beautiful Web and mobile applications. We come together to share ideas and [change the world](http://mirego.org).

We also [love open-source software](http://open.mirego.com) and we try to give back to the community as much as we can.