Skip to content
simple helper to render table using given collection
Ruby
Find file
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
gemfiles
lib
spec
.gitignore
.travis.yml
.watchr :title_callback added to columns, docs updated, version incremented Nov 17, 2011
Changelog
Gemfile
README.rdoc
Rakefile content_tag_for is used for producing table rows (now <tr> will have … Mar 27, 2011
init.rb
table_for_collection.gemspec

README.rdoc

Description

table_for_collection is a simple gem used to render tables based on the given collection.

Install

Just add to your Gemfile

gem 'table_for_collection'

Simplest examle

<%= table_for @users do -%>
  <% columns :name, :email, :address %>
<% end %>

In this case you just put fields list to the :columns method. This ruby code will produce following HTML:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Email</th>
      <th>Address</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>John Smith</td>
      <td>john.smith@example.com</td>
      <td>100 Spear St., NY, USA</td>
    </tr>
  </tbody>
</table>

Simple examle

<%= table_for @users, :html => {
  :class => "simple-table",
  :id => "users",
  :width => "100%",
  :tr => {
    :class => lambda { |user| "simple-row #{user.role}" },
    :id => lambda { |user| "user-row-#{user.id}" }
  }
} do -%>
  <% column :name, :html => { :th => { :width => "25%" }, :td => { :class => "user-name" }} %>
  <% column :email, :width => "20%" %>
  <% column :address, :title => "Home" %>
  <% column :created_at, :title_callback => lambda { |title| link_to(title, users_path(params.merge(:order => "desc"))) } %>
<% end %>

You can put :html hash to the options list (inside the :column method too). In this case table will be created with given html attributes. To assign :tr options use :tr key under :html - :class value will be added to the classes list, :id can be instance of the Proc class, in this it will be called for each collection element. For column width you can use shortcut :width, remember that :width shortcut has higher priority. Also :title value in the :column method will be used as column's title. You can pass Proc object to the :title_callback param. In this case given proc will be called with title value. It will produce HTML similar to:

<table class="simple-table" id="users" width="100%">
  <thead>
    <tr>
      <th width="25%">Name</th>
      <th width="20%">Email</th>
      <th>Home</th>
      <th><a href="/users?order=desc">Created At</a></th>
    </tr>
  </thead>
  <tbody>
    <tr class="simple-row" id="user-row-12">
      <td class="user-name">...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr class="simple-row" id="user-row-14">
      ...
    </tr>
  </tbody>
</table>

More complex example

<%= table_for @users do -%>
  <% column :login, :title => "User name" %>
  <% column :email do |email| %>
    <% mail_to email %>
  <% end %>
  <% column :title => "Full name" do |user| %>
    <% [user.first_name, user.last_name].join(" ") %>
  <% end %>
  <% column :company %>
  <% column :title => "Actions" do |user| %>
    <% [link_to("Show", user), link_to("Delete", user, :method => :delete)].join(" | ") %>
  <% end %>
  <% column :role, :default => "guest" %>
  <% column :created_at, :time_format => "%Y-%m-%d" %>
<% end %>

Example with colorized rows

<%= table_for @users, :html => { :tr => { :class => "row" } }, :stripes => %w{even odd} do %>
  <% column :name %>
  <% column :email %>
  <% column :address %>
<% end %>

Also class given by :stripe option will be merged with options[:html][:tr] so this code will produce following HTML:

<tr class="row even">...
<tr class="row odd">...
<tr class="row even">...
<tr class="row odd">...

Relations

If you need a column for relation or apply method for simple column you can use :attr option:

<%= table_for @users do -%>
  <% column :login %>
  <% column :company, :attr => :name %>
  <% column :name, :attr => :underscore %>
<% end %>

I18n

When column name is set, but :title is not, helper tries to find translation in standard mechanism of the ActiveModel. For more information visit: guides.rubyonrails.org/i18n.html#translations-for-active-record-models

Known issues

Unfortunately it works incorrect if there is no “-” before %> in this code:

<%= table_for @users do -%>

We hope it will be fixed soon.

Also we need to check if all our samples are correct.

Something went wrong with that request. Please try again.