Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: 767effd31d

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 lib
Octocat-spinner-32 spec
Octocat-spinner-32 .document
Octocat-spinner-32 .gitignore
Octocat-spinner-32 LICENSE
Octocat-spinner-32 README.textile
Octocat-spinner-32 Rakefile
Octocat-spinner-32 VERSION
Octocat-spinner-32 totally_tabular.gemspec
README.textile

Totally Tabular!

Assuming I have 5 people with:
  • first_name
  • last_name
  • registration_status
My pointy-haired boss wants to see a list of these people on our administrative dashboard. Sure, I could write some ugly ERB like so:
  
    <table class="people">
      <thead>
      <tr>
        <th class="header">First Name</th>
        <th>Last Name</th>
        <th>Registration Status</th>
      </tr>
      </thead>
      <tbody>
      <% @people.each do |person| %>
        <tr class="<%= person.registration_status %>">
          <td>Michael Bluth</td>
          <td>Bluth</td>
          <td>
            <% if person.registered? %>
              <strong>Registered</strong>
            <% else %>
              <em>Unregistered</em>
            <% end %>
        </tr>
      <% end %>
      </tbody>
    </table>
  
But why? I mean, we’re using Ruby for Pete’s sake! How about a cleaner way to do the same thing?
  
    <%= person_table(people_presenter.people, :class => 'people') %>
  
Okay, so that’s just a custom Rails helper method. Nothing special. But let’s look at the definition of the helper method! That’s where the special sauce is.
  
    def person_table(people, attributes={})
      TableView.new(@people, :class => 'people') do
        define_column("First Name") do |person|
          header_attributes!(:class => 'header')
          row_attributes!(:class => person.registration_status)
          template! do
            person.first_name
          end
        end
        define_column("Last Name") do |person|
          template! do
            person.last_name
          end
        end
        define_column("Registration Status") do |person|
          template! do
            if person.registered?
              content_tag(:strong, "Registered")
            else
              content_tag(:em, "Unregistered")
            end
          end
        end
      end
    end
  
Something went wrong with that request. Please try again.