Module: TableHelper
- Defined in:
- lib/table_helper.rb,
lib/table_helper/row.rb,
lib/table_helper/body.rb,
lib/table_helper/cell.rb,
lib/table_helper/footer.rb,
lib/table_helper/header.rb,
lib/table_helper/version.rb,
lib/table_helper/body_row.rb,
lib/table_helper/html_element.rb,
lib/table_helper/collection_table.rb
Overview
Provides a set of methods for turning a collection into a table
Defined Under Namespace
Classes: Body, BodyRow, Cell, CollectionTable, Footer, Header, HtmlElement, Row, RowBuilder
Constant Summary collapse
- VERSION =
'0.3.0'
Instance Method Summary collapse
-
#collection_table(collection, klass = nil, html_options = {}, &block) ⇒ Object
Generates a new table for the given collection.
Instance Method Details
#collection_table(collection, klass = nil, html_options = {}, &block) ⇒ Object
Generates a new table for the given collection.
Basic Example
This example shows the most basic usage of collection_table
which takes information about a collection, the objects in them, the columns defined for the class, and generates a table based on that.
Suppose you have a table generated by a migration like so:
class CreatePeople < ActiveRecord::Base
def self.up
create_table do |t|
t.string :first_name
t.string :last_name
t.integer :company_id
t.string :role
end
end
end
…then invoking the helper within a view:
<%= collection_table Person.find(:all) %>
…is compiled to (formatted here for the sake of sanity):
<table cellpadding="0" cellspacing="0" class="posts ui-collection">
<thead>
<tr>
<th class="person-first_name" scope="col">First Name</th>
<th class="person-last_name" scope="col">Last Name</th>
<th class="person-company_id" scope="col">Company</th>
<th class="person-role" scope="col">Role</th>
</tr>
</thead>
<tbody>
<tr class="person ui-collection-result">
<td class="person-first_name">John</td>
<td class="person-last_name">Doe</td>
<td class="person-company_id">1</td>
<td class="person-role">President</td>
</tr>
<tr class="person ui-collection-result">
<td class="first_name">Jane</td>
<td class="last_name">Doe</td>
<td class="company_id">1</td>
<td class="role">Vice-President</td>
</tr>
</tbody>
<table>
Advanced Example
This example below shows how collection_table
can be customized to show specific headers, content, and footers.
<%=
collection_table(@posts, :id => 'posts', :class => 'summary') do |t|
t.header :title
t.header :category
t.header :author
t.header :publish_date, 'Date<br \>Published'
t.header :num_comments, '# Comments'
t.header :num_trackbacks, '# Trackbacks'
t.rows.alternate = :odd
t.rows.each do |row, post, index|
row.category post.category.name
row.author post.author.name
row.publish_date time_ago_in_words(post.published_at)
row.num_comments post.comments.empty? ? '-' : post.comments.size
row.num_trackbacks post.trackbacks.empty? ? '-' : post.trackbacks.size
end
end
%>
…is compiled to (formatted here for the sake of sanity):
<table cellpadding="0" cellspacing="0" class="summary posts ui-collection" id="posts">
<thead>
<tr>
<th class="post-title" scope="col">Title</th>
<th class="post-category" scope="col">Category</th>
<th class="post-author" scope="col">Author</th>
<th class="post-publish_date" scope="col">Date<br \>Published</th>
<th class="post-num_comments" scope="col"># Comments</th>
<th class="post-num_trackbacks" scope="col"># Trackbacks</th>
</tr>
</thead>
<tbody>
<tr class="post ui-collection-result">
<td class="post-title">Open-source projects: The good, the bad, and the ugly</td>
<td class="post-category">General</td>
<td class="post-author">John Doe</td>
<td class="post-publish_date">23 days</td>
<td class="post-num_comments">-</td>
<td class="post-num_trackbacks">-</td>
</tr>
<tr class="post ui-collection-result ui-state-alternate">
<td class="post-title">5 reasons you should care about Rails</td>
<td class="post-category">Rails</td>
<td class="author">John Q. Public</td>
<td class="post-publish_date">21 days</td>
<td class="post-num_comments">-</td>
<td class="post-num_trackbacks">-</td>
</tr>
<tr class="post ui-collection-result">
<td class="post-title">Deprecation: Stop digging yourself a hole</td>
<td class="post-category">Rails</td>
<td class="post-author">Jane Doe</td>
<td class="post-publish_date">17 days</td>
<td class="post-num_comments">-</td>
<td class="post-num_trackbacks">-</td>
</tr>
<tr class="post ui-collection-result ui-state-alternate">
<td class="post-title">Jumpstart your Rails career at RailsConf 2007</td>
<td class="post-category">Conferences</td>
<td class="post-author">Jane Doe</td>
<td class="post-publish_date">4 days</td>
<td class="post-num_comments">-</td>
<td class="post-num_trackbacks">-</td>
</tr>
<tr class="post ui-collection-result">
<td class="post-title">Getting some REST</td>
<td class="post-category">Rails</td>
<td class="post-author">John Doe</td>
<td class="post-publish_date">about 18 hours</td>
<td class="post-num_comments">-</td>
<td class="post-num_trackbacks">-</td>
</tr>
</tbody>
</table>
Creating footers
Footers allow you to show some sort of summary information based on the data displayed in the body of the table. Below is an example:
<%
collection_table(@posts) do |t|
t.header :title
t.header :category
t.header :author
t.header :publish_date, 'Date<br \>Published'
t.header :num_comments, '# Comments'
t.header :num_trackbacks, '# Trackbacks'
t.rows.alternate = :odd
t.rows.each do |row, post, index|
row.category post.category.name
row.author post.author.name
row.publish_date time_ago_in_words(post.published_at)
row.num_comments post.comments.empty? ? '-' : post.comments.size
row.num_trackbacks post.trackbacks.empty? ? '-' : post.trackbacks.size
end
t.footer :num_comments, @posts.inject(0) {|sum, post| sum += post.comments.size}
t.footer :num_trackbacks, @posts.inject(0) {|sum, post| sum += post.trackbacks.size}
end
%>
…is compiled to:
<table cellpadding="0" cellspacing="0" class="posts ui-collection">
<thead>
<tr>
<th class="post-title" scope="col">Title</th>
<th class="post-category" scope="col">Category</th>
<th class="post-author" scope="col">Author</th>
<th class="post-publish_date" scope="col">Date<br \>Published</th>
<th class="post-num_comments" scope="col"># Comments</th>
<th class="post-num_trackbacks" scope="col"># Trackbacks</th>
</tr>
</thead>
<tbody>
<tr class="post ui-collection-result">
<td class="post-title">Open-source projects: The good, the bad, and the ugly</td>
<td class="post-category">General</td>
<td class="post-author">John Doe</td>
<td class="post-publish_date">23 days</td>
<td class="post-num_comments">-</td>
<td class="post-num_trackbacks">-</td>
</tr>
<tr class="post ui-collection-result ui-state-alternate">
<td class="post-title">5 reasons you should care about Rails</td>
<td class="post-category">Rails</td><td class="author">John Q. Public</td>
<td class="post-publish_date">21 days</td>
<td class="post-num_comments">-</td>
<td class="post-num_trackbacks">-</td>
</tr>
</tbody>
<tfoot>
<tr>
<td class="post-num_comments">0</td>
<td class="post-num_trackbacks" colspan="5">0</td>
</tr>
</tfoot>
<table>
206 207 208 |
# File 'lib/table_helper.rb', line 206 def collection_table(collection, klass = nil, = {}, &block) CollectionTable.new(collection, klass, , &block).html end |