table_helper 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +10 -0
- data/LICENSE +1 -1
- data/README.rdoc +78 -67
- data/Rakefile +1 -1
- data/lib/table_helper.rb +200 -169
- data/lib/table_helper/body.rb +46 -49
- data/lib/table_helper/body_row.rb +18 -14
- data/lib/table_helper/cell.rb +33 -22
- data/lib/table_helper/collection_table.rb +111 -37
- data/lib/table_helper/footer.rb +9 -7
- data/lib/table_helper/header.rb +31 -93
- data/lib/table_helper/html_element.rb +1 -3
- data/lib/table_helper/row.rb +16 -7
- data/test/helpers/table_helper_test.rb +20 -12
- data/test/unit/body_row_test.rb +66 -16
- data/test/unit/body_test.rb +159 -131
- data/test/unit/cell_test.rb +90 -16
- data/test/unit/collection_table_test.rb +166 -192
- data/test/unit/footer_test.rb +33 -8
- data/test/unit/header_test.rb +136 -114
- data/test/unit/row_builder_test.rb +16 -8
- data/test/unit/row_test.rb +106 -45
- metadata +3 -5
- data/test/unit/header_builder_test.rb +0 -48
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
== master
|
2
2
|
|
3
|
+
== 0.2.0 / 2009-04-25
|
4
|
+
|
5
|
+
* Reorganize documentation
|
6
|
+
* Allow css classes to be customized
|
7
|
+
* Use the jQuery UI css naming convention
|
8
|
+
* Allow multiple headers to be created at once
|
9
|
+
* No longer allow pre-existing headers to be customized (instead must re-define all headers)
|
10
|
+
* Remove :header / :footer options
|
11
|
+
* Simplify public interface
|
12
|
+
|
3
13
|
== 0.1.0 / 2008-12-14
|
4
14
|
|
5
15
|
* Remove the PluginAWeek namespace
|
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -35,27 +35,27 @@ these types of tables by DRYing much of the html being generated.
|
|
35
35
|
|
36
36
|
...is compiled to (formatted here for the sake of sanity):
|
37
37
|
|
38
|
-
<table cellpadding="0" cellspacing="0">
|
38
|
+
<table cellpadding="0" cellspacing="0" class="people ui-collection">
|
39
39
|
<thead>
|
40
40
|
<tr>
|
41
|
-
<th class="first_name" scope="col">First Name</th>
|
42
|
-
<th class="last_name" scope="col">Last Name</th>
|
43
|
-
<th class="company_id" scope="col">Company</th>
|
44
|
-
<th class="role" scope="col">Role</th>
|
41
|
+
<th class="person-first_name" scope="col">First Name</th>
|
42
|
+
<th class="person-last_name" scope="col">Last Name</th>
|
43
|
+
<th class="person-company_id" scope="col">Company</th>
|
44
|
+
<th class="person-role" scope="col">Role</th>
|
45
45
|
</tr>
|
46
46
|
</thead>
|
47
47
|
<tbody>
|
48
|
-
<tr class="
|
49
|
-
<td class="first_name">John</td>
|
50
|
-
<td class="last_name">Doe</td>
|
51
|
-
<td class="company_id">1</td>
|
52
|
-
<td class="role">President</td>
|
48
|
+
<tr class="person ui-collection-result">
|
49
|
+
<td class="person-first_name">John</td>
|
50
|
+
<td class="person-last_name">Doe</td>
|
51
|
+
<td class="person-company_id">1</td>
|
52
|
+
<td class="person-role">President</td>
|
53
53
|
</tr>
|
54
|
-
<tr class="
|
55
|
-
<td class="first_name">Jane</td>
|
56
|
-
<td class="last_name">Doe</td>
|
57
|
-
<td class="company_id">1</td>
|
58
|
-
<td class="role">Vice-President</td>
|
54
|
+
<tr class="person ui-collection-result">
|
55
|
+
<td class="person-first_name">Jane</td>
|
56
|
+
<td class="person-last_name">Doe</td>
|
57
|
+
<td class="person-company_id">1</td>
|
58
|
+
<td class="person-role">Vice-President</td>
|
59
59
|
</tr>
|
60
60
|
</tbody>
|
61
61
|
<table>
|
@@ -63,79 +63,90 @@ these types of tables by DRYing much of the html being generated.
|
|
63
63
|
=== Advanced Example
|
64
64
|
|
65
65
|
<%=
|
66
|
-
collection_table(@posts,
|
67
|
-
header
|
68
|
-
header
|
69
|
-
header
|
70
|
-
header
|
71
|
-
header
|
72
|
-
header
|
66
|
+
collection_table(@posts, :id => 'posts', :class => 'summary') do |t|
|
67
|
+
t.header :title
|
68
|
+
t.header :category
|
69
|
+
t.header :author
|
70
|
+
t.header :publish_date, 'Date<br \>Published'
|
71
|
+
t.header :num_comments, '# Comments'
|
72
|
+
t.header :num_trackbacks, '# Trackbacks'
|
73
73
|
|
74
|
-
|
75
|
-
|
74
|
+
t.rows.alternate = :odd
|
75
|
+
t.rows.each do |row, post, index|
|
76
|
+
# Notice there's no need to explicitly define the title
|
76
77
|
row.category post.category.name
|
77
78
|
row.author post.author.name
|
78
|
-
row.publish_date time_ago_in_words(post.
|
79
|
+
row.publish_date time_ago_in_words(post.published_at)
|
79
80
|
row.num_comments post.comments.empty? ? '-' : post.comments.size
|
80
81
|
row.num_trackbacks post.trackbacks.empty? ? '-' : post.trackbacks.size
|
81
82
|
end
|
83
|
+
|
84
|
+
t.footer :num_comments, @posts.inject(0) {|sum, post| sum += post.comments.size}
|
85
|
+
t.footer :num_trackbacks, @posts.inject(0) {|sum, post| sum += post.trackbacks.size}
|
82
86
|
end
|
83
87
|
%>
|
84
88
|
|
85
89
|
...is compiled to (formatted here for the sake of sanity):
|
86
90
|
|
87
|
-
<table cellpadding="0" cellspacing="0" class="summary" id="posts">
|
91
|
+
<table cellpadding="0" cellspacing="0" class="summary posts ui-collection" id="posts">
|
88
92
|
<thead>
|
89
93
|
<tr>
|
90
|
-
<th class="title" scope="col">Title</th>
|
91
|
-
<th class="category" scope="col">Category</th>
|
92
|
-
<th class="author" scope="col">Author</th>
|
93
|
-
<th class="publish_date" scope="col">Date<br \>Published</th>
|
94
|
-
<th class="num_comments" scope="col"># Comments</th>
|
95
|
-
<th class="num_trackbacks" scope="col"># Trackbacks</th>
|
94
|
+
<th class="post-title" scope="col">Title</th>
|
95
|
+
<th class="post-category" scope="col">Category</th>
|
96
|
+
<th class="post-author" scope="col">Author</th>
|
97
|
+
<th class="post-publish_date" scope="col">Date<br \>Published</th>
|
98
|
+
<th class="post-num_comments" scope="col"># Comments</th>
|
99
|
+
<th class="post-num_trackbacks" scope="col"># Trackbacks</th>
|
96
100
|
</tr>
|
97
101
|
</thead>
|
98
|
-
<tbody
|
99
|
-
<tr class="
|
100
|
-
<td class="title">Open-source projects: The good, the bad, and the ugly</td>
|
101
|
-
<td class="category">General</td>
|
102
|
-
<td class="author">John Doe</td>
|
103
|
-
<td class="publish_date">23 days</td>
|
104
|
-
<td class="num_comments">-</td>
|
105
|
-
<td class="num_trackbacks">-</td>
|
102
|
+
<tbody>
|
103
|
+
<tr class="post ui-collection-result">
|
104
|
+
<td class="post-title">Open-source projects: The good, the bad, and the ugly</td>
|
105
|
+
<td class="post-category">General</td>
|
106
|
+
<td class="post-author">John Doe</td>
|
107
|
+
<td class="post-publish_date">23 days</td>
|
108
|
+
<td class="post-num_comments">-</td>
|
109
|
+
<td class="post-num_trackbacks">-</td>
|
106
110
|
</tr>
|
107
|
-
<tr class="
|
108
|
-
<td class="title">5 reasons you should care about Rails</td>
|
109
|
-
<td class="category">Rails</td
|
110
|
-
<td class="
|
111
|
-
<td class="
|
112
|
-
<td class="
|
111
|
+
<tr class="post ui-collection-result ui-state-alternate">
|
112
|
+
<td class="post-title">5 reasons you should care about Rails</td>
|
113
|
+
<td class="post-category">Rails</td>
|
114
|
+
<td class="post-author">John Q. PUblic</td>
|
115
|
+
<td class="post-publish_date">21 days</td>
|
116
|
+
<td class="post-num_comments">-</td>
|
117
|
+
<td class="post-num_trackbacks">-</td>
|
113
118
|
</tr>
|
114
|
-
<tr class="
|
115
|
-
<td class="title">Deprecation: Stop digging yourself a hole</td>
|
116
|
-
<td class="category">Rails</td>
|
117
|
-
<td class="author">Jane Doe</td>
|
118
|
-
<td class="publish_date">17 days</td>
|
119
|
-
<td class="num_comments">-</td>
|
120
|
-
<td class="num_trackbacks">-</td>
|
119
|
+
<tr class="post ui-collection-result">
|
120
|
+
<td class="post-title">Deprecation: Stop digging yourself a hole</td>
|
121
|
+
<td class="post-category">Rails</td>
|
122
|
+
<td class="post-author">Jane Doe</td>
|
123
|
+
<td class="post-publish_date">17 days</td>
|
124
|
+
<td class="post-num_comments">-</td>
|
125
|
+
<td class="post-num_trackbacks">-</td>
|
121
126
|
</tr>
|
122
|
-
<tr class="
|
123
|
-
<td class="title">Jumpstart your Rails career at RailsConf 2007</td>
|
124
|
-
<td class="category">Conferences</td>
|
125
|
-
<td class="author">Jane Doe</td>
|
126
|
-
<td class="publish_date">4 days</td>
|
127
|
-
<td class="num_comments">-</td>
|
128
|
-
<td class="num_trackbacks">-</td>
|
127
|
+
<tr class="post ui-collection-result ui-state-alternate">
|
128
|
+
<td class="post-title">Jumpstart your Rails career at RailsConf 2007</td>
|
129
|
+
<td class="post-category">Conferences</td>
|
130
|
+
<td class="post-author">Jane Doe</td>
|
131
|
+
<td class="post-publish_date">4 days</td>
|
132
|
+
<td class="post-num_comments">-</td>
|
133
|
+
<td class="post-num_trackbacks">-</td>
|
129
134
|
</tr>
|
130
|
-
<tr class="
|
131
|
-
<td class="title">Getting some REST</td>
|
132
|
-
<td class="category">Rails</td>
|
133
|
-
<td class="author">John Doe</td>
|
134
|
-
<td class="publish_date">about 18 hours</td>
|
135
|
-
<td class="num_comments">-</td>
|
136
|
-
<td class="num_trackbacks">-</td>
|
135
|
+
<tr class="post ui-collection-result">
|
136
|
+
<td class="post-title">Getting some REST</td>
|
137
|
+
<td class="post-category">Rails</td>
|
138
|
+
<td class="post-author">John Doe</td>
|
139
|
+
<td class="post-publish_date">about 18 hours</td>
|
140
|
+
<td class="post-num_comments">-</td>
|
141
|
+
<td class="post-num_trackbacks">-</td>
|
137
142
|
</tr>
|
138
143
|
</tbody>
|
144
|
+
<tfoot>
|
145
|
+
<tr>
|
146
|
+
<td class="post-num_comments">0</td>
|
147
|
+
<td class="post-num_trackbacks">0</td>
|
148
|
+
</tr>
|
149
|
+
</tfoot>
|
139
150
|
</table>
|
140
151
|
|
141
152
|
=== Caveat Emptor
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require 'rake/contrib/sshpublisher'
|
|
5
5
|
|
6
6
|
spec = Gem::Specification.new do |s|
|
7
7
|
s.name = 'table_helper'
|
8
|
-
s.version = '0.
|
8
|
+
s.version = '0.2.0'
|
9
9
|
s.platform = Gem::Platform::RUBY
|
10
10
|
s.summary = 'Adds a helper method for generating HTML tables from collections'
|
11
11
|
|
data/lib/table_helper.rb
CHANGED
@@ -1,177 +1,208 @@
|
|
1
1
|
require 'table_helper/collection_table'
|
2
2
|
|
3
|
-
# Provides a set of methods for turning a collection into a table
|
4
|
-
#
|
5
|
-
# == Basic Example
|
6
|
-
#
|
7
|
-
# This example shows the most basic usage of +collection_table+ which takes
|
8
|
-
# information about a collection, the objects in them, the columns defined
|
9
|
-
# for the class, and generates a table based on that.
|
10
|
-
#
|
11
|
-
# Suppose you have a table generated by a migration like so:
|
12
|
-
#
|
13
|
-
# class CreatePeople < ActiveRecord::Base
|
14
|
-
# def self.up
|
15
|
-
# create_table do |t|
|
16
|
-
# t.string :first_name
|
17
|
-
# t.string :last_name
|
18
|
-
# t.integer :company_id
|
19
|
-
# t.string :role
|
20
|
-
# end
|
21
|
-
# end
|
22
|
-
# end
|
23
|
-
#
|
24
|
-
# ...then invoking the helper within a view:
|
25
|
-
#
|
26
|
-
# <%= collection_table Person.find(:all) %>
|
27
|
-
#
|
28
|
-
# ...is compiled to (formatted here for the sake of sanity):
|
29
|
-
#
|
30
|
-
# <table cellpadding="0" cellspacing="0">
|
31
|
-
# <thead>
|
32
|
-
# <tr>
|
33
|
-
# <th class="first_name" scope="col">First Name</th>
|
34
|
-
# <th class="last_name" scope="col">Last Name</th>
|
35
|
-
# <th class="company_id" scope="col">Company</th>
|
36
|
-
# <th class="role" scope="col">Role</th>
|
37
|
-
# </tr>
|
38
|
-
# </thead>
|
39
|
-
# <tbody>
|
40
|
-
# <tr class="row">
|
41
|
-
# <td class="first_name">John</td>
|
42
|
-
# <td class="last_name">Doe</td>
|
43
|
-
# <td class="company_id">1</td>
|
44
|
-
# <td class="role">President</td>
|
45
|
-
# </tr>
|
46
|
-
# <tr class="row">
|
47
|
-
# <td class="first_name">Jane</td>
|
48
|
-
# <td class="last_name">Doe</td>
|
49
|
-
# <td class="company_id">1</td>
|
50
|
-
# <td class="role">Vice-President</td>
|
51
|
-
# </tr>
|
52
|
-
# </tbody>
|
53
|
-
# <table>
|
54
|
-
#
|
55
|
-
# == Advanced Example
|
56
|
-
#
|
57
|
-
# This example below shows how +collection_table+ can be customized to show
|
58
|
-
# specific headers, content, and footers.
|
59
|
-
#
|
60
|
-
# <%=
|
61
|
-
# collection_table(@posts, {}, :id => 'posts', :class => 'summary') do |header, body|
|
62
|
-
# header.column :title
|
63
|
-
# header.column :category
|
64
|
-
# header.column :author
|
65
|
-
# header.column :publish_date, 'Date<br \>Published'
|
66
|
-
# header.column :num_comments, '# Comments'
|
67
|
-
# header.column :num_trackbacks, '# Trackbacks'
|
68
|
-
#
|
69
|
-
# body.alternate = true
|
70
|
-
# body.build do |row, post, index|
|
71
|
-
# row.category post.category.name
|
72
|
-
# row.author post.author.name
|
73
|
-
# row.publish_date time_ago_in_words(post.published_on)
|
74
|
-
# row.num_comments post.comments.empty? ? '-' : post.comments.size
|
75
|
-
# row.num_trackbacks post.trackbacks.empty? ? '-' : post.trackbacks.size
|
76
|
-
# end
|
77
|
-
# end
|
78
|
-
# %>
|
79
|
-
#
|
80
|
-
# ...is compiled to (formatted here for the sake of sanity):
|
81
|
-
#
|
82
|
-
# <table cellpadding="0" cellspacing="0" class="summary" id="posts">
|
83
|
-
# <thead>
|
84
|
-
# <tr>
|
85
|
-
# <th class="title" scope="col">Title</th>
|
86
|
-
# <th class="category" scope="col">Category</th>
|
87
|
-
# <th class="author" scope="col">Author</th>
|
88
|
-
# <th class="publish_date" scope="col">Date<br \>Published</th>
|
89
|
-
# <th class="num_comments" scope="col"># Comments</th>
|
90
|
-
# <th class="num_trackbacks" scope="col"># Trackbacks</th>
|
91
|
-
# </tr>
|
92
|
-
# </thead>
|
93
|
-
# <tbody class="alternate">
|
94
|
-
# <tr class="row">
|
95
|
-
# <td class="title">Open-source projects: The good, the bad, and the ugly</td>
|
96
|
-
# <td class="category">General</td>
|
97
|
-
# <td class="author">John Doe</td>
|
98
|
-
# <td class="publish_date">23 days</td>
|
99
|
-
# <td class="num_comments">-</td>
|
100
|
-
# <td class="num_trackbacks">-</td>
|
101
|
-
# </tr>
|
102
|
-
# <tr class="row alternate">
|
103
|
-
# <td class="title">5 reasons you should care about Rails</td>
|
104
|
-
# <td class="category">Rails</td><td class="author">John Q. Public</td>
|
105
|
-
# <td class="publish_date">21 days</td>
|
106
|
-
# <td class="num_comments">-</td>
|
107
|
-
# <td class="num_trackbacks">-</td>
|
108
|
-
# </tr>
|
109
|
-
# <tr class="row">
|
110
|
-
# <td class="title">Deprecation: Stop digging yourself a hole</td>
|
111
|
-
# <td class="category">Rails</td>
|
112
|
-
# <td class="author">Jane Doe</td>
|
113
|
-
# <td class="publish_date">17 days</td>
|
114
|
-
# <td class="num_comments">-</td>
|
115
|
-
# <td class="num_trackbacks">-</td>
|
116
|
-
# </tr>
|
117
|
-
# <tr class="row alternate">
|
118
|
-
# <td class="title">Jumpstart your Rails career at RailsConf 2007</td>
|
119
|
-
# <td class="category">Conferences</td>
|
120
|
-
# <td class="author">Jane Doe</td>
|
121
|
-
# <td class="publish_date">4 days</td>
|
122
|
-
# <td class="num_comments">-</td>
|
123
|
-
# <td class="num_trackbacks">-</td>
|
124
|
-
# </tr>
|
125
|
-
# <tr class="row">
|
126
|
-
# <td class="title">Getting some REST</td>
|
127
|
-
# <td class="category">Rails</td>
|
128
|
-
# <td class="author">John Doe</td>
|
129
|
-
# <td class="publish_date">about 18 hours</td>
|
130
|
-
# <td class="num_comments">-</td>
|
131
|
-
# <td class="num_trackbacks">-</td>
|
132
|
-
# </tr>
|
133
|
-
# </tbody>
|
134
|
-
# </table>
|
135
|
-
#
|
136
|
-
# == Creating footers
|
137
|
-
#
|
138
|
-
# Footers allow you to show some sort of summary information based on the
|
139
|
-
# data displayed in the body of the table. Below is an example:
|
140
|
-
#
|
141
|
-
# <%
|
142
|
-
# collection_table(@posts, :footer => true) do |header, body, footer|
|
143
|
-
# header.column :title
|
144
|
-
# header.column :category
|
145
|
-
# header.column :author
|
146
|
-
# header.column :publish_date, 'Date<br \>Published'
|
147
|
-
# header.column :num_comments, '# Comments'
|
148
|
-
# header.column :num_trackbacks, '# Trackbacks'
|
149
|
-
#
|
150
|
-
# body.alternate = true
|
151
|
-
# body.build do |row, post, index|
|
152
|
-
# row.category post.category.name
|
153
|
-
# row.author post.author.name
|
154
|
-
# row.publish_date time_ago_in_words(post.published_on)
|
155
|
-
# row.num_comments post.comments.empty? ? '-' : post.comments.size
|
156
|
-
# row.num_trackbacks post.trackbacks.empty? ? '-' : post.trackbacks.size
|
157
|
-
# end
|
158
|
-
#
|
159
|
-
# footer.cell :num_comments, @posts.inject(0) {|sum, post| sum += post.comments.size}
|
160
|
-
# footer.cell :num_trackbacks, @posts.inject(0) {|sum, post| sum += post.trackbacks.size}
|
161
|
-
# end
|
162
|
-
# %>
|
3
|
+
# Provides a set of methods for turning a collection into a table
|
163
4
|
module TableHelper
|
164
|
-
#
|
5
|
+
# Generates a new table for the given collection.
|
165
6
|
#
|
166
|
-
#
|
7
|
+
# == Basic Example
|
167
8
|
#
|
168
|
-
#
|
169
|
-
#
|
170
|
-
#
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
9
|
+
# This example shows the most basic usage of +collection_table+ which takes
|
10
|
+
# information about a collection, the objects in them, the columns defined
|
11
|
+
# for the class, and generates a table based on that.
|
12
|
+
#
|
13
|
+
# Suppose you have a table generated by a migration like so:
|
14
|
+
#
|
15
|
+
# class CreatePeople < ActiveRecord::Base
|
16
|
+
# def self.up
|
17
|
+
# create_table do |t|
|
18
|
+
# t.string :first_name
|
19
|
+
# t.string :last_name
|
20
|
+
# t.integer :company_id
|
21
|
+
# t.string :role
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# ...then invoking the helper within a view:
|
27
|
+
#
|
28
|
+
# <%= collection_table Person.find(:all) %>
|
29
|
+
#
|
30
|
+
# ...is compiled to (formatted here for the sake of sanity):
|
31
|
+
#
|
32
|
+
# <table cellpadding="0" cellspacing="0" class="posts ui-collection">
|
33
|
+
# <thead>
|
34
|
+
# <tr>
|
35
|
+
# <th class="person-first_name" scope="col">First Name</th>
|
36
|
+
# <th class="person-last_name" scope="col">Last Name</th>
|
37
|
+
# <th class="person-company_id" scope="col">Company</th>
|
38
|
+
# <th class="person-role" scope="col">Role</th>
|
39
|
+
# </tr>
|
40
|
+
# </thead>
|
41
|
+
# <tbody>
|
42
|
+
# <tr class="person ui-collection-result">
|
43
|
+
# <td class="person-first_name">John</td>
|
44
|
+
# <td class="person-last_name">Doe</td>
|
45
|
+
# <td class="person-company_id">1</td>
|
46
|
+
# <td class="person-role">President</td>
|
47
|
+
# </tr>
|
48
|
+
# <tr class="person ui-collection-result">
|
49
|
+
# <td class="first_name">Jane</td>
|
50
|
+
# <td class="last_name">Doe</td>
|
51
|
+
# <td class="company_id">1</td>
|
52
|
+
# <td class="role">Vice-President</td>
|
53
|
+
# </tr>
|
54
|
+
# </tbody>
|
55
|
+
# <table>
|
56
|
+
#
|
57
|
+
# == Advanced Example
|
58
|
+
#
|
59
|
+
# This example below shows how +collection_table+ can be customized to show
|
60
|
+
# specific headers, content, and footers.
|
61
|
+
#
|
62
|
+
# <%=
|
63
|
+
# collection_table(@posts, :id => 'posts', :class => 'summary') do |t|
|
64
|
+
# t.header :title
|
65
|
+
# t.header :category
|
66
|
+
# t.header :author
|
67
|
+
# t.header :publish_date, 'Date<br \>Published'
|
68
|
+
# t.header :num_comments, '# Comments'
|
69
|
+
# t.header :num_trackbacks, '# Trackbacks'
|
70
|
+
#
|
71
|
+
# t.rows.alternate = :odd
|
72
|
+
# t.rows.each do |row, post, index|
|
73
|
+
# row.category post.category.name
|
74
|
+
# row.author post.author.name
|
75
|
+
# row.publish_date time_ago_in_words(post.published_at)
|
76
|
+
# row.num_comments post.comments.empty? ? '-' : post.comments.size
|
77
|
+
# row.num_trackbacks post.trackbacks.empty? ? '-' : post.trackbacks.size
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
# %>
|
81
|
+
#
|
82
|
+
# ...is compiled to (formatted here for the sake of sanity):
|
83
|
+
#
|
84
|
+
# <table cellpadding="0" cellspacing="0" class="summary posts ui-collection" id="posts">
|
85
|
+
# <thead>
|
86
|
+
# <tr>
|
87
|
+
# <th class="post-title" scope="col">Title</th>
|
88
|
+
# <th class="post-category" scope="col">Category</th>
|
89
|
+
# <th class="post-author" scope="col">Author</th>
|
90
|
+
# <th class="post-publish_date" scope="col">Date<br \>Published</th>
|
91
|
+
# <th class="post-num_comments" scope="col"># Comments</th>
|
92
|
+
# <th class="post-num_trackbacks" scope="col"># Trackbacks</th>
|
93
|
+
# </tr>
|
94
|
+
# </thead>
|
95
|
+
# <tbody>
|
96
|
+
# <tr class="post ui-collection-result">
|
97
|
+
# <td class="post-title">Open-source projects: The good, the bad, and the ugly</td>
|
98
|
+
# <td class="post-category">General</td>
|
99
|
+
# <td class="post-author">John Doe</td>
|
100
|
+
# <td class="post-publish_date">23 days</td>
|
101
|
+
# <td class="post-num_comments">-</td>
|
102
|
+
# <td class="post-num_trackbacks">-</td>
|
103
|
+
# </tr>
|
104
|
+
# <tr class="post ui-collection-result ui-state-alternate">
|
105
|
+
# <td class="post-title">5 reasons you should care about Rails</td>
|
106
|
+
# <td class="post-category">Rails</td>
|
107
|
+
# <td class="author">John Q. Public</td>
|
108
|
+
# <td class="post-publish_date">21 days</td>
|
109
|
+
# <td class="post-num_comments">-</td>
|
110
|
+
# <td class="post-num_trackbacks">-</td>
|
111
|
+
# </tr>
|
112
|
+
# <tr class="post ui-collection-result">
|
113
|
+
# <td class="post-title">Deprecation: Stop digging yourself a hole</td>
|
114
|
+
# <td class="post-category">Rails</td>
|
115
|
+
# <td class="post-author">Jane Doe</td>
|
116
|
+
# <td class="post-publish_date">17 days</td>
|
117
|
+
# <td class="post-num_comments">-</td>
|
118
|
+
# <td class="post-num_trackbacks">-</td>
|
119
|
+
# </tr>
|
120
|
+
# <tr class="post ui-collection-result ui-state-alternate">
|
121
|
+
# <td class="post-title">Jumpstart your Rails career at RailsConf 2007</td>
|
122
|
+
# <td class="post-category">Conferences</td>
|
123
|
+
# <td class="post-author">Jane Doe</td>
|
124
|
+
# <td class="post-publish_date">4 days</td>
|
125
|
+
# <td class="post-num_comments">-</td>
|
126
|
+
# <td class="post-num_trackbacks">-</td>
|
127
|
+
# </tr>
|
128
|
+
# <tr class="post ui-collection-result">
|
129
|
+
# <td class="post-title">Getting some REST</td>
|
130
|
+
# <td class="post-category">Rails</td>
|
131
|
+
# <td class="post-author">John Doe</td>
|
132
|
+
# <td class="post-publish_date">about 18 hours</td>
|
133
|
+
# <td class="post-num_comments">-</td>
|
134
|
+
# <td class="post-num_trackbacks">-</td>
|
135
|
+
# </tr>
|
136
|
+
# </tbody>
|
137
|
+
# </table>
|
138
|
+
#
|
139
|
+
# == Creating footers
|
140
|
+
#
|
141
|
+
# Footers allow you to show some sort of summary information based on the
|
142
|
+
# data displayed in the body of the table. Below is an example:
|
143
|
+
#
|
144
|
+
# <%
|
145
|
+
# collection_table(@posts) do |t|
|
146
|
+
# t.header :title
|
147
|
+
# t.header :category
|
148
|
+
# t.header :author
|
149
|
+
# t.header :publish_date, 'Date<br \>Published'
|
150
|
+
# t.header :num_comments, '# Comments'
|
151
|
+
# t.header :num_trackbacks, '# Trackbacks'
|
152
|
+
#
|
153
|
+
# t.rows.alternate = :odd
|
154
|
+
# t.rows.each do |row, post, index|
|
155
|
+
# row.category post.category.name
|
156
|
+
# row.author post.author.name
|
157
|
+
# row.publish_date time_ago_in_words(post.published_at)
|
158
|
+
# row.num_comments post.comments.empty? ? '-' : post.comments.size
|
159
|
+
# row.num_trackbacks post.trackbacks.empty? ? '-' : post.trackbacks.size
|
160
|
+
# end
|
161
|
+
#
|
162
|
+
# t.footer :num_comments, @posts.inject(0) {|sum, post| sum += post.comments.size}
|
163
|
+
# t.footer :num_trackbacks, @posts.inject(0) {|sum, post| sum += post.trackbacks.size}
|
164
|
+
# end
|
165
|
+
# %>
|
166
|
+
#
|
167
|
+
# ...is compiled to:
|
168
|
+
#
|
169
|
+
# <table cellpadding="0" cellspacing="0" class="posts ui-collection">
|
170
|
+
# <thead>
|
171
|
+
# <tr>
|
172
|
+
# <th class="post-title" scope="col">Title</th>
|
173
|
+
# <th class="post-category" scope="col">Category</th>
|
174
|
+
# <th class="post-author" scope="col">Author</th>
|
175
|
+
# <th class="post-publish_date" scope="col">Date<br \>Published</th>
|
176
|
+
# <th class="post-num_comments" scope="col"># Comments</th>
|
177
|
+
# <th class="post-num_trackbacks" scope="col"># Trackbacks</th>
|
178
|
+
# </tr>
|
179
|
+
# </thead>
|
180
|
+
# <tbody>
|
181
|
+
# <tr class="post ui-collection-result">
|
182
|
+
# <td class="post-title">Open-source projects: The good, the bad, and the ugly</td>
|
183
|
+
# <td class="post-category">General</td>
|
184
|
+
# <td class="post-author">John Doe</td>
|
185
|
+
# <td class="post-publish_date">23 days</td>
|
186
|
+
# <td class="post-num_comments">-</td>
|
187
|
+
# <td class="post-num_trackbacks">-</td>
|
188
|
+
# </tr>
|
189
|
+
# <tr class="post ui-collection-result ui-state-alternate">
|
190
|
+
# <td class="post-title">5 reasons you should care about Rails</td>
|
191
|
+
# <td class="post-category">Rails</td><td class="author">John Q. Public</td>
|
192
|
+
# <td class="post-publish_date">21 days</td>
|
193
|
+
# <td class="post-num_comments">-</td>
|
194
|
+
# <td class="post-num_trackbacks">-</td>
|
195
|
+
# </tr>
|
196
|
+
# </tbody>
|
197
|
+
# <tfoot>
|
198
|
+
# <tr>
|
199
|
+
# <td class="post-num_comments">0</td>
|
200
|
+
# <td class="post-num_trackbacks">0</td>
|
201
|
+
# </tr>
|
202
|
+
# </tfoot>
|
203
|
+
# <table>
|
204
|
+
def collection_table(collection, klass = nil, html_options = {}, &block)
|
205
|
+
CollectionTable.new(collection, klass, html_options, &block).html
|
175
206
|
end
|
176
207
|
end
|
177
208
|
|