radar / tutorial

Tutorial that's been on old for too long

This URL has Read+Write access

tutorial / views.html
100644 427 lines (368 sloc) 79.688 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link href="files/style.css" media="screen" rel="stylesheet" type="text/css">
<link href="files/twilight.css" media="screen" rel="stylesheet" type="text/css">
</head>
<body>
<div align="center">
<div id="flash" style="display: none;"></div>
<table id="everything" cellpadding="0" cellspacing="0" width="98%">
<tbody>
<tr>
<td id="left">&nbsp;</td>
<td class="content">
<img alt="Logo" id="logo" src="files/logo.jpg"><br><br><br><br><br>
<h1>How to create a Forum</h1> by Radar
<span id="fr"></span>
<span id="fl"><a href="controllers.html">« Controllers</a></span>
<br><br>
<h2>Views</h2>
<p>First of all we're going to create a layout for our site. Nothing too fancy. We start with a file called <em>application.html.erb</em> in the <em>app/views/layouts</em> folder. What? It's not there? Well create it then! While you're at it, make it look like this:</p>
 
<p><strong class="code-title">app/views/layouts/application.html.erb</strong>
</p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;!</span><span class="DoctypeXmlProcessing"><span class="DoctypeXmlProcessing">DOCTYPE</span> html PUBLIC <span class="DoctypeXmlProcessing">"-//W3C//DTD XHTML 1.0 Strict//EN"</span></span></span>
<span class="line-numbers"> 2 </span> <span class="MetaTagAll"><span class="DoctypeXmlProcessing"><span class="DoctypeXmlProcessing">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"</span></span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">html</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">head</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 5 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> just_here <span class="Keyword">=</span> <span class="String"><span class="String">"</span>for showing off<span class="String">"</span></span> <span class="EmbeddedSourceBright">-%&gt;</span></span>
<span class="line-numbers"> 6 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> javascript_include_tag <span class="Constant"><span class="Constant">:</span>defaults</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 7 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> stylesheet_link_tag <span class="String"><span class="String">"</span>default<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 8 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">title</span><span class="MetaTagInline">&gt;</span></span>The Forums<span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">title</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 9 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">head</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 10 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">body</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 11 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">for</span> message <span class="Keyword">in</span> flash <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 12 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">div</span> <span class="MetaTagAll">class</span>=<span class="String"><span class="String">'</span>flash<span class="String">'</span></span> <span class="MetaTagAll"><span class="MetaTagAll">id</span><span class="MetaTagAll">=</span><span class="String"><span class="String">'</span><span class="String"><span class="StringEmbeddedSource"><span class="StringEmbeddedSource">&lt;%=</span> message<span class="StringEmbeddedSource"><span class="StringEmbeddedSource">.</span><span class="MetaTagAll">first</span></span> <span class="StringEmbeddedSource">%&gt;</span></span></span><span class="String">'</span></span></span><span class="MetaTagAll">&gt;</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> message<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">last</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">div</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 13 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">end</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 14 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="Keyword">yield</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 15 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">body</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 16 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">html</span><span class="MetaTagAll">&gt;</span></span>
</pre><p></p>
 
<p>This is an ERB (<strong>E</strong>mbeded <strong>R</strong>u<strong>b</strong>y
template, signified by the content inside of it, and the extension on
the end of the file. It's a HTML file with Ruby embedded in it. One of
the things that people don't see when they see ERB files is the
difference between <span class="term">&lt;%</span> and <span class="term">&lt;%=</span>. <span class="term">&lt;%</span> is a ruby evaluation block, meaning it will evaluate the code in it and do nothing more. A <span class="term">&lt;%=</span>
block however will run the code inside of it, and then output it. The
final thing here is the end of the first evaluation block; notice how
it has the <span class="term">-</span> before it? This will stop the new line after it, so instead of having:</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">head</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 2 </span>
<span class="line-numbers"> 3 </span> <span class="EmbeddedSource"> <span class="EmbeddedSource">&lt;</span><span class="MetaTagInline">script</span> <span class="MetaTagInline">src</span>=<span class="String"><span class="String">"</span>/javascripts/prototype.js?1227417997<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/javascript<span class="String">"</span></span><span class="EmbeddedSource">&gt;</span><span class="EmbeddedSource">&lt;/</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="EmbeddedSource"> <span class="EmbeddedSource">&lt;</span><span class="MetaTagInline">script</span> <span class="MetaTagInline">src</span>=<span class="String"><span class="String">"</span>/javascripts/effects.js?1227417997<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/javascript<span class="String">"</span></span><span class="EmbeddedSource">&gt;</span><span class="EmbeddedSource">&lt;/</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span></span>
<span class="line-numbers"> 5 </span> <span class="EmbeddedSource"> <span class="EmbeddedSource">&lt;</span><span class="MetaTagInline">script</span> <span class="MetaTagInline">src</span>=<span class="String"><span class="String">"</span>/javascripts/dragdrop.js?1227417997<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/javascript<span class="String">"</span></span><span class="EmbeddedSource">&gt;</span><span class="EmbeddedSource">&lt;/</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span></span>
<span class="line-numbers"> 6 </span> <span class="EmbeddedSource"> <span class="EmbeddedSource">&lt;</span><span class="MetaTagInline">script</span> <span class="MetaTagInline">src</span>=<span class="String"><span class="String">"</span>/javascripts/controls.js?1227417997<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/javascript<span class="String">"</span></span><span class="EmbeddedSource">&gt;</span><span class="EmbeddedSource">&lt;/</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span></span>
<span class="line-numbers"> 7 </span> <span class="EmbeddedSource"> <span class="EmbeddedSource">&lt;</span><span class="MetaTagInline">script</span> <span class="MetaTagInline">src</span>=<span class="String"><span class="String">"</span>/javascripts/application.js?1227417997<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/javascript<span class="String">"</span></span><span class="EmbeddedSource">&gt;</span><span class="EmbeddedSource">&lt;/</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span></span>
<span class="line-numbers"> 8 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">link</span> <span class="MetaTagInline">href</span>=<span class="String"><span class="String">"</span>/stylesheets/default.css?1227417997<span class="String">"</span></span> <span class="MetaTagInline">media</span>=<span class="String"><span class="String">"</span>screen<span class="String">"</span></span> <span class="MetaTagInline">rel</span>=<span class="String"><span class="String">"</span>stylesheet<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/css<span class="String">"</span></span> /<span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 9 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">title</span><span class="MetaTagInline">&gt;</span></span>The Forums<span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">title</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 10 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">head</span><span class="MetaTagAll">&gt;</span></span>
</pre><p></p>
 
<p>You now get:</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">head</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="EmbeddedSource"> <span class="EmbeddedSource">&lt;</span><span class="MetaTagInline">script</span> <span class="MetaTagInline">src</span>=<span class="String"><span class="String">"</span>/javascripts/prototype.js?1227417997<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/javascript<span class="String">"</span></span><span class="EmbeddedSource">&gt;</span><span class="EmbeddedSource">&lt;/</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="EmbeddedSource"> <span class="EmbeddedSource">&lt;</span><span class="MetaTagInline">script</span> <span class="MetaTagInline">src</span>=<span class="String"><span class="String">"</span>/javascripts/effects.js?1227417997<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/javascript<span class="String">"</span></span><span class="EmbeddedSource">&gt;</span><span class="EmbeddedSource">&lt;/</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="EmbeddedSource"> <span class="EmbeddedSource">&lt;</span><span class="MetaTagInline">script</span> <span class="MetaTagInline">src</span>=<span class="String"><span class="String">"</span>/javascripts/dragdrop.js?1227417997<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/javascript<span class="String">"</span></span><span class="EmbeddedSource">&gt;</span><span class="EmbeddedSource">&lt;/</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span></span>
<span class="line-numbers"> 5 </span> <span class="EmbeddedSource"> <span class="EmbeddedSource">&lt;</span><span class="MetaTagInline">script</span> <span class="MetaTagInline">src</span>=<span class="String"><span class="String">"</span>/javascripts/controls.js?1227417997<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/javascript<span class="String">"</span></span><span class="EmbeddedSource">&gt;</span><span class="EmbeddedSource">&lt;/</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span></span>
<span class="line-numbers"> 6 </span> <span class="EmbeddedSource"> <span class="EmbeddedSource">&lt;</span><span class="MetaTagInline">script</span> <span class="MetaTagInline">src</span>=<span class="String"><span class="String">"</span>/javascripts/application.js?1227417997<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/javascript<span class="String">"</span></span><span class="EmbeddedSource">&gt;</span><span class="EmbeddedSource">&lt;/</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span></span>
<span class="line-numbers"> 7 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">link</span> <span class="MetaTagInline">href</span>=<span class="String"><span class="String">"</span>/stylesheets/default.css?1227417997<span class="String">"</span></span> <span class="MetaTagInline">media</span>=<span class="String"><span class="String">"</span>screen<span class="String">"</span></span> <span class="MetaTagInline">rel</span>=<span class="String"><span class="String">"</span>stylesheet<span class="String">"</span></span> <span class="MetaTagInline">type</span>=<span class="String"><span class="String">"</span>text/css<span class="String">"</span></span> /<span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 8 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">title</span><span class="MetaTagInline">&gt;</span></span>The Forums<span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">title</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 9 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">head</span><span class="MetaTagAll">&gt;</span></span>
</pre><p></p>
 
<p>The code directly under the opening of the body tag is a mix of ruby
evaluation and output tags. The first line will cycle through all the
messages in the flash (think of it as a news<b>flash</b> for your
application) and then the next line will output them in div tags. The
final line here just tells the for statement that we only want to do
that one thing, so we tell it to <span class="term">end</span>.</p>
 
<p>One more special mention is the call to yield in <em>app/views/layouts/application.html.erb</em>. This method will put the template in place of where this method is. To better explain, let's create a template called <em>app/views/forums/index.html.erb</em>. In this template let's just put some code:</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> This is <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> params<span class="EmbeddedSourceBright">[</span><span class="Constant"><span class="Constant">:</span>controller</span><span class="EmbeddedSourceBright">]</span> <span class="EmbeddedSourceBright">%&gt;</span></span>, <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> params<span class="EmbeddedSourceBright">[</span><span class="Constant"><span class="Constant">:</span>action</span><span class="EmbeddedSourceBright">]</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
</pre><p></p>
 
<p>Now if you go to <a href="http://127.0.0.1:3000/">http://127.0.0.1:3000</a>, you'll see the following:</p>
 
<p>"This is forums, index"</p>
 
<p>Which is exactly what we wanted to see. Now if you view the source for this page, you'll see all the code we put in our <em>app/views/layouts/application.html.erb</em> file, with yield being replaced by the content from the template.</p>
 
<p>Now we'll replace it with some information gathered from our
controller. We'll be using a table to lay out our forums index page,
something like this:</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">table</span> <span class="MetaTagInline"><span class="MetaTagInline">id</span><span class="MetaTagInline">=</span><span class="String"><span class="String">'</span><span class="String">forums</span><span class="String">'</span></span></span> <span class="MetaTagInline">class</span>=<span class="String"><span class="String">'</span>list-table<span class="String">'</span></span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">thead</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>Title<span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 5 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>Last Post<span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 6 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 7 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">thead</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 8 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">tbody</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 9 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">unless</span> <span class="Variable"><span class="Variable">@</span>forums</span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">empty?</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 10 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">for</span> forum <span class="Keyword">in</span> <span class="Variable"><span class="Variable">@</span>forums</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 11 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 12 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 13 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> link_to forum<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">title</span></span><span class="EmbeddedSourceBright">,</span> forum <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 14 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">br</span> /<span class="MetaTagInline">&gt;</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> forum<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">description</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 15 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 16 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 17 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">unless</span> forum<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">last_post</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">nil?</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 18 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> forum<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">last_post</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">topic</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span> at <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="EmbeddedSourceBright"><span class="Entity">time_ago_in_words</span></span><span class="EmbeddedSourceBright">(</span>forum<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">last_post</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">created_at</span></span><span class="EmbeddedSourceBright">)</span> <span class="EmbeddedSourceBright">%&gt;</span></span> by <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> forum<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">last_post</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">user</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 19 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">else</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 20 </span> None
<span class="line-numbers"> 21 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">end</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 22 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 23 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 24 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">end</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 25 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">else</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 26 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 27 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span> <span class="MetaTagInline">colspan</span>=<span class="String"><span class="String">'</span>3<span class="String">'</span></span> <span class="MetaTagInline"><span class="MetaTagInline">id</span><span class="MetaTagInline">=</span><span class="String"><span class="String">'</span><span class="String">empty-message</span><span class="String">'</span></span></span><span class="MetaTagInline">&gt;</span></span>There are no forums.<span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 28 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 29 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">end</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 30 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">tbody</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 31 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">table</span><span class="MetaTagInline">&gt;</span></span>
</pre><p></p>
 
<p>This will be a very basic table layout with three columns across the
top and a message telling you, "There are no forums", in the next row.
The code in here will generate a table, and depending on what <span class="term">#empty?</span>
returns, will render either a list of all forums or a message telling
us there are no forums. When it's rendering the list, it cycles through
all the objects in @forums by doing <span class="term">for forum in @forum</span> and then it uses the ERB output block <span class="term">&lt;%=</span>,
and then calls the field name methods on the forum object. For the
title column I've snuck in a little RESTful goodness. For the link_to,
you don't have to specify <span class="term">forum_path(forum)</span>, because just forum will do. If you pass any ActiveRecord object to <span class="term">#link_to</span> it will attempt to generate a route to the show action. There's a method here that isn't yet defined, and that's the <span class="term">last_post</span> method, which we'll work on now. For starters we'll just put a method definition inside our forum model:</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="Keyword">class</span> <span class="Entity">Forum<span class="EntityInheritedClass"> <span class="EntityInheritedClass">&lt;</span> ActiveRecord::Base</span></span>
<span class="line-numbers"> 2 </span> <span class="SupportFunction">has_many</span> <span class="Constant"><span class="Constant">:</span>topics</span>
<span class="line-numbers"> 3 </span> <span class="SupportFunction">has_many</span> <span class="Constant"><span class="Constant">:</span>posts</span>, <span class="Constant"><span class="Constant">:</span>through</span> =&gt; <span class="Constant"><span class="Constant">:</span>topics</span>
<span class="line-numbers"> 4 </span> <span class="SupportFunction">validates_presence_of</span> <span class="Constant"><span class="Constant">:</span>title</span>, <span class="Constant"><span class="Constant">:</span>description</span>
<span class="line-numbers"> 5 </span> <span class="SupportFunction">validates_length_of</span> <span class="Constant"><span class="Constant">:</span>description</span>, <span class="Constant"><span class="Constant">:</span>minimum</span> =&gt; <span class="Constant">4</span>
<span class="line-numbers"> 6 </span>
<span class="line-numbers"> 7 </span> <span class="Keyword">def</span> <span class="Entity">last_post</span>
<span class="line-numbers"> 8 </span> posts.<span class="Entity">sort_by</span>(<span class="Keyword">&amp;</span><span class="Constant"><span class="Constant">:</span>created_at</span>).<span class="Entity">last</span>
<span class="line-numbers"> 9 </span> <span class="Keyword">end</span>
<span class="line-numbers"> 10 </span> <span class="Keyword">end</span>
</pre><p></p>
 
<p>This code calls <span class="term">#sort_by</span> on our posts method, which was defined when we did <span class="term">has_many :posts, :through =&gt; :topics</span> and then we use what is known as a "proc to symbol" to call the created_at method on all the posts inside of posts<sup>1</sup>
and then we call last on that returned array to find the final post.
Back to the forums index view for a moment, if there is no last post,
the unless statement (effectively a negative if) will output simply
"None". So we could add a new forum to get the ball rolling, except we
have no real way to do that right now. Let's just add a <span class="term">link_to</span> above the forums table for now:</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> link_to <span class="String"><span class="String">"</span>New Forum<span class="String">"</span></span><span class="EmbeddedSourceBright">,</span> new_forum_path <span class="EmbeddedSourceBright">%&gt;</span></span>
</pre><p></p>
 
<p>Refresh the page and click the link. Now you should be greeted with the following message...</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> Template is missing
<span class="line-numbers"> 2 </span>
<span class="line-numbers"> 3 </span> Missing template forums/new.html.erb in view path /path/to/your/application/app/views
</pre><p></p>
 
<p>... which we'll fix right now. Create a new file called new.html.erb in app/views/forums and put this in it:</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">h2</span><span class="MetaTagAll">&gt;</span></span>New Forum<span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">h2</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> form_for <span class="Variable"><span class="Variable">@</span>forum</span> <span class="Keyword">do </span><span class="EmbeddedSourceBright">|</span><span class="Variable">f</span><span class="EmbeddedSourceBright">|</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="SupportFunction">render</span> <span class="Constant"><span class="Constant">:</span>partial</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="String"><span class="String">"</span>form<span class="String">"</span></span><span class="EmbeddedSourceBright">,</span> <span class="Constant"><span class="Constant">:</span>locals</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="EmbeddedSourceBright">{</span><span class="EmbeddedSourceBright"> </span><span class="Constant"><span class="Constant">:</span>f</span> <span class="EmbeddedSourceBright">=&gt;</span> f <span class="EmbeddedSourceBright">}</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> f<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">submit</span></span> <span class="String"><span class="String">"</span>Create<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 5 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">end</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
</pre><p></p>
 
<p>Firstly we'll explain what partials are. Partials are view code you
want repeated. It's very good practice to put parts of your code that
you would otherwise repeat in to partials. Partial file's names are
prefixed with an underscore ( _ ) and that's how you can identify when
looking at a folder's content what is and is not a partial. </p>
 
<p><span class="term">form_for</span> is another one of those methods that uses a block. We pass the <span class="term">@forum</span> object to it, and then define <span class="term">f</span>
as being the output of the method inside the block by encasing it in
pipe characters. Note that even though this method uses a Ruby <b>evaluation</b> block, that it will still output HTML. Inside the form_for block, we call <span class="term">render :partial =&gt; "form", :locals =&gt; { :f =&gt; f } %&gt;</span> which tells Rails we want to render a partial. We specify the second option, <span class="term">:locals =&gt; { :f =&gt; f }</span>
to pass in local variables to the partial. Since local variables are
not passed on to partials, we need to call this. We could define the <span class="term">f</span> local variable way back in our <span class="term">form_for</span> as an instance variable (<span class="term">@f</span>), but that would break as soon as Ruby 1.9 rolls around , so we won't do that. The final method we call is the <span class="term">submit</span> which will generate a submit tag for our form.</p>
 
<p>Now refreshing the new forum page you'll get something like this...</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> Couldn't find template file for forums/_form in ["/path/to/application/app/views"]
</pre><p></p>
 
<p>This is because we don't have the form partial that we called for!</p>
 
<p>Create a file called _form.html.erb in your app/views/forums folder. This file will contain the common elements in our forms.</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> error_messages_for <span class="Constant"><span class="Constant">:</span>forum</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">p</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> f<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">label</span></span> <span class="String"><span class="String">"</span>title<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">br</span> /<span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> f<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">text_field</span></span> <span class="String"><span class="String">"</span>title<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 5 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">p</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 6 </span>
<span class="line-numbers"> 7 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">p</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 8 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> f<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">label</span></span> <span class="String"><span class="String">"</span>description<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">br</span> /<span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 9 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> f<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">text_area</span></span> <span class="String"><span class="String">"</span>description<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 10 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">p</span><span class="MetaTagAll">&gt;</span></span>
</pre><p></p>
 
<p>So far we only have two fields in our forums table, a title and a
description and so that's all we'll need in the forum form partial now.
The <span class="term">f</span> object that we call <span class="term">label</span>, <span class="term">text_field</span> and <span class="term">text_area</span> is actually the form builder object passed in from the new page, when we called <span class="term">&lt;%= render :partial =&gt; "form", :locals =&gt; { :f =&gt; f } %&gt;</span>. <span class="term">label</span>
will generate a label tag pointing at the corresponding form element,
for example the first one here will point to a form element with the id
of forum_title. The idea of labels is that it gives you another place
to click to gain focus on that element, as well as displaying helpful
information about what it is. The <span class="term">text_field</span> will generate a simple input tag, <span class="term">&lt;input type='text' name='forum[title]' id='forum_title'&gt;</span>. Finally, the <span class="term">text_area</span> call will generate <span class="term">&lt;textarea name='forum[description]' id='forum_description'&gt;&lt;/textarea&gt;</span>.
You can specify additional attributes on all of these methods, for
example if you wanted to increase the length of the title you would
have <span class="term">&lt;%= f.text_field "title", :size =&gt; 100 %&gt;</span>.</p>
 
<p>Now that we have a way of submitting information to our create
action made back in the Controllers section, we'll do just that. Go
onto your new forum page and type in a description only and try
pressing the submit button. Notice that box that came up? That's the
generic error messages box, telling us our validations have failed. If
you typed in a sufficiently long enough description (4 or more
characters) it'll only complain that the title is missing, but if you
didn't type in either it would complain that the description is not
only blank, but is also less than 4 characters. Try typing in a title
and a long enough description now, and you should be redirected back to
the forums index page. You'll get to see your newly created forum now.
It will display a title and a description, and nothing in the last
post's column. Now what if you wanted to edit the forum? Currently, we
don't have a link or a page to do that. Firstly we'll create the link
by going into our <i>app/forums/index.html.erb</i> file and adding it in after the description.</p>
 
<p><b class="code-title">app/views/forums/index.html.erb</b>
</p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> forum<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">description</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">br</span> /<span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> link_to <span class="String"><span class="String">"</span>Edit Forum<span class="String">"</span></span><span class="EmbeddedSourceBright">,</span> <span class="EmbeddedSourceBright"><span class="Entity">edit_forum_path</span></span><span class="EmbeddedSourceBright">(</span>forum<span class="EmbeddedSourceBright">)</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
</pre><p></p>
 
<p>Here we call a RESTful routing helper generated by <span class="term">map.resources :forums</span> in <i>config/routes.rb</i>: <span class="term">edit_forum_path(forum)</span>. This will generate a route the same way putting <span class="term">{ :controller =&gt; "forums", :action =&gt; "edit", :id =&gt; forum.id }</span> would. The route it generates is: <span class="term">/forums/[forum.id]/edit</span>. Now you should receive a message saying that the template is missing for the edit page:</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> Template is missing
<span class="line-numbers"> 2 </span>
<span class="line-numbers"> 3 </span> Missing template forums/edit.html.erb in view path /path/to/your/application/app/views
</pre><p></p>
 
<p>Look familiar? It should. It's the same kind of error we received when we didn't have a new.html.erb. So we'll create <i>app/views/forums/edit.html.erb</i>:</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">h2</span><span class="MetaTagAll">&gt;</span></span>Editing Forum: <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="Variable"><span class="Variable">@</span>forum</span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">title</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">h2</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> form_for <span class="Variable"><span class="Variable">@</span>forum</span> <span class="Keyword">do </span><span class="EmbeddedSourceBright">|</span><span class="Variable">f</span><span class="EmbeddedSourceBright">|</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="SupportFunction">render</span> <span class="Constant"><span class="Constant">:</span>partial</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="String"><span class="String">"</span>form<span class="String">"</span></span><span class="EmbeddedSourceBright">,</span> <span class="Constant"><span class="Constant">:</span>locals</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="EmbeddedSourceBright">{</span><span class="EmbeddedSourceBright"> </span><span class="Constant"><span class="Constant">:</span>f</span> <span class="EmbeddedSourceBright">=&gt;</span> f <span class="EmbeddedSourceBright">}</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> f<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">submit</span></span> <span class="String"><span class="String">"</span>Update<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 5 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">end</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
</pre><p></p>
 
<p>This looks identical to <i>app/views/forums/new.html.erb</i> with
three exceptions, the content of the h2 tag is different, and the text
on our submit button is different. The third exception is that I've
used <span class="term">f.submit</span> instead of <span class="term">submit_tag</span> just to show that there is no difference between the two. Again the <span class="term">form_for</span>
comes to the rescue here by automatically realising that @forum is not
a new record and so will send us to the update action. Previously in
rails you would have to type <span class="term">form_for :forum, @forum, forum_path(@forum), :method =&gt; "put"</span>, so this is a huge improvement over the old ways. </p>
 
<p>So far we've covered the index, new, create, edit and update
actions, and we only have two more to do: show and destroy. That little
<span class="term">#link_to</span> goodness I snuck in way back near
the beginning of this section will help us here. By clicking on your
newly created forum's title we can be taken straight to the show
action. Again you should see that familiar template is missing error:</p>
 
<p></p><pre class="twilight"><span class="line-numbers"> 1 </span> Template is missing
<span class="line-numbers"> 2 </span>
<span class="line-numbers"> 3 </span> Missing template forums/show.html.erb in view path /path/to/your/application/app/views
</pre><p></p>
 
<p>And we'll create this page. The idea of this page is that a user has
selected a forum and now wants to see what topics are inside of that
forum, so now we'll creae a page for them to do that.</p>
 
<p><b>app/views/forums/show.html.erb</b>
</p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">h2</span><span class="MetaTagAll">&gt;</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="Variable"><span class="Variable">@</span>forum</span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">title</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">h2</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> link_to <span class="String"><span class="String">"</span>New Topic<span class="String">"</span></span><span class="EmbeddedSourceBright">,</span> <span class="EmbeddedSourceBright"><span class="Entity">new_forum_topic_path</span></span><span class="EmbeddedSourceBright">(</span><span class="Variable"><span class="Variable">@</span>forum</span><span class="EmbeddedSourceBright">)</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">table</span> <span class="MetaTagInline"><span class="MetaTagInline">id</span><span class="MetaTagInline">=</span><span class="String"><span class="String">'</span><span class="String">topics</span><span class="String">'</span></span></span> <span class="MetaTagInline">class</span>=<span class="String"><span class="String">'</span>list-table<span class="String">'</span></span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">thead</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 5 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 6 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>Subject<span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 7 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>Views<span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 8 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>Posts<span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 9 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>Last Post<span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 10 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 11 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">thead</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 12 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">tbody</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 13 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">unless</span> <span class="Variable"><span class="Variable">@</span>topics</span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">empty?</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 14 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">for</span> topic <span class="Keyword">in</span> <span class="Variable"><span class="Variable">@</span>topics</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 15 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 16 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> link_to topic<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">subject</span></span><span class="EmbeddedSourceBright">,</span> topic <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 17 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> topic<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">views</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 18 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> topic<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">posts</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">size</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 19 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> topic<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">posts</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">last</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">user</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span> at <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="EmbeddedSourceBright"><span class="Entity">distance_of_time_in_words</span></span><span class="EmbeddedSourceBright">(</span>topic<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">posts</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">last</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">created_at</span></span><span class="EmbeddedSourceBright">)</span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 20 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 21 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">end</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 22 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">else</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 23 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 24 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span> <span class="MetaTagInline">colspan</span>=<span class="String"><span class="String">'</span>3<span class="String">'</span></span><span class="MetaTagInline">&gt;</span></span>There are no topics in this forum<span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 25 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 26 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">end</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 27 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">tbody</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 28 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">table</span><span class="MetaTagInline">&gt;</span></span>
</pre><p></p>
 
<p>This view provides us with a list of topics currently in the forum
we've selected, with a link to the topic, the number of views the topic
has received, the number of posts inside the topic, and information
about the last post: the user who posted it and how long ago in words
it was. Right at the top of the table is a link to creating a new
topic. When this link is clicked it will take us to <span class="term">/forums/1/topics/new</span> and will provide us with the view for creating a new topic, but first we need to create the view. The view lives in <em>app/views/topics/</em> and is called <em>new.html.erb</em>. This is going to look a lot like the forum new view, but is going to create two new objects for us, a topic and a post.</p>
 
<p><b>app/views/topics/new.html.erb</b>
</p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">h2</span><span class="MetaTagAll">&gt;</span></span>Creating a new topic in <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="Variable"><span class="Variable">@</span>forum</span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">h2</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> form_for <span class="EmbeddedSourceBright">[</span><span class="Variable"><span class="Variable">@</span>forum</span><span class="EmbeddedSourceBright">,</span> <span class="Variable"><span class="Variable">@</span>topic</span><span class="EmbeddedSourceBright">]</span> <span class="Keyword">do </span><span class="EmbeddedSourceBright">|</span><span class="Variable">f</span><span class="EmbeddedSourceBright">|</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="SupportFunction">render</span> <span class="Constant"><span class="Constant">:</span>partial</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="String"><span class="String">"</span>form<span class="String">"</span></span><span class="EmbeddedSourceBright">,</span> <span class="Constant"><span class="Constant">:</span>locals</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="EmbeddedSourceBright">{</span><span class="EmbeddedSourceBright"> </span><span class="Constant"><span class="Constant">:</span>f</span> <span class="EmbeddedSourceBright">=&gt;</span> f <span class="EmbeddedSourceBright">}</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> submit_tag <span class="String"><span class="String">"</span>Create<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 5 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">end</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
</pre><p></p>
 
<p>Notice how in the <span class="term">#form_for</span> we pass it two objects in an array <span class="term">[@forum, @topic]</span>. This is just telling <span class="term">form_for</span> that we want to generate a route for both the <span class="term">@forum</span> object and the <span class="term">@topic</span> object. The route generated will be <span class="term">/forums/#{@forum.id}/topics</span>
and the form will post to this URL, so it will go to the create action
in the topics controller. Before we can do that however, we need to
create our form partial.</p>
 
<p><b>app/views/topics/_form.html.erb</b>
</p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">p</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> f<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">label</span></span> <span class="String"><span class="String">"</span>subject<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> f<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">text_field</span></span> <span class="String"><span class="String">"</span>subject<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">p</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 5 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> fields_for <span class="Variable"><span class="Variable">@</span>post</span> <span class="Keyword">do </span><span class="EmbeddedSourceBright">|</span><span class="Variable">post</span><span class="EmbeddedSourceBright">|</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 6 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">p</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 7 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> post<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">label</span></span> <span class="String"><span class="String">'</span>text<span class="String">'</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 8 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> post<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">text_area</span></span> <span class="String"><span class="String">'</span>text<span class="String">'</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 9 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">p</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 10 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">end</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
</pre><p></p>
 
<p>This is just like the forum form partial that we made, except for one difference, we use <span class="term">fields_for</span>. <span class="term">fields_for</span> is a method that when used as a block, will give us a method just like the <span class="term">form_for</span> helper does. Then we can call all the form helpers on this method as if we called <span class="term">form_for</span>. Think of <span class="term">fields_for</span> like a <span class="term">form_for</span> without the form. We pass the instance variable <span class="term">@post</span>
to fields for, and we just make a small text area for our post and
attach a label to it. This will then get passed to our controller as <span class="term">params[:post][:text]</span>, just like the topic subject will get passed as <span class="term">params[:topic][:subject]</span>.</p>
 
<p>Now we should be able to create a new topic, give the new action a go. After doing that you should be redirected to <em>/forums/1/topics/1</em> or something similar, which should then give you a <span class="term">Template is missing</span> error, which we'll fix right now by creating the topics/show template and a few other views.</p>
 
<p><b class="code-title">app/views/topics/show.html.erb</b>
</p><pre class="twilight"><span class="line-numbers"> 1 </span> <span class="MetaTagAll"><span class="MetaTagAll">&lt;</span><span class="MetaTagAll">h2</span><span class="MetaTagAll">&gt;</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="Variable"><span class="Variable">@</span>topic</span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">subject</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagAll"><span class="MetaTagAll">&lt;/</span><span class="MetaTagAll">h2</span><span class="MetaTagAll">&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="SupportFunction">render</span> <span class="Constant"><span class="Constant">:</span>partial</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="String"><span class="String">"</span>menu<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="SupportFunction">render</span> <span class="Constant"><span class="Constant">:</span>partial</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="Variable"><span class="Variable">@</span>posts</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="SupportFunction">render</span> <span class="Constant"><span class="Constant">:</span>partial</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="String"><span class="String">"</span>menu<span class="String">"</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
</pre><p></p>
 
<p>This view displays our topic's subject and then underneath it
renders three partials. The first partial is "menu" which will just
give us a small menu with links to common options like creating new
replies and topics in this forum. The next one gets a bit trickier
because we're calling <span class="term">render :partial</span> but we're passing in a variable (<span class="term">@posts</span>) which just so happens to be a collection of posts. <span class="term">render :partial</span>
acknowledges that we're passing in a collection and will use the class
name of the objects to determine which partial to render which in this
case will be <em>posts/post[/em]. A longer way of doing that is:</em></p>
 
<p></p><pre class="twilight"><span class="line-numbers"><em> 1 </em></span><em> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="SupportFunction">render</span> <span class="Constant"><span class="Constant">:</span>partial</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="String"><span class="String">"</span>posts/post<span class="String">"</span></span><span class="EmbeddedSourceBright">,</span> <span class="Constant"><span class="Constant">:</span>collection</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="Variable"><span class="Variable">@</span>posts</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
</em></pre><p></p>
 
<p><em>which will do exactly the same thing as our original call to <span class="term">render :partial</span>. An even longer way of doing it is:</em></p>
 
<p></p><pre class="twilight"><span class="line-numbers"><em> 1 </em></span><em> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">for</span> post <span class="Keyword">in</span> <span class="Variable"><span class="Variable">@</span>posts</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="SupportFunction">render</span> <span class="Constant"><span class="Constant">:</span>partial</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="String"><span class="String">"</span>posts/post<span class="String">"</span></span><span class="EmbeddedSourceBright">,</span> <span class="Constant"><span class="Constant">:</span>locals</span> <span class="EmbeddedSourceBright">=&gt;</span> <span class="EmbeddedSourceBright">{</span><span class="EmbeddedSourceBright"> </span><span class="Constant"><span class="Constant">:</span>post</span> <span class="EmbeddedSourceBright">=&gt;</span> post <span class="EmbeddedSourceBright">}</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%</span> <span class="Keyword">end</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
</em></pre><p></p>
 
<p><em>This is the menu partial that was mentioned earlier:</em></p>
 
<p><em><b>app/views/topics/_menu.html.erb</b>
</em></p><pre class="twilight"><span class="line-numbers"><em> 1 </em></span><em> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> link_to <span class="String"><span class="String">"</span>New Reply<span class="String">"</span></span><span class="EmbeddedSourceBright">,</span> <span class="EmbeddedSourceBright"><span class="Entity">new_topic_post_path</span></span><span class="EmbeddedSourceBright">(</span><span class="Variable"><span class="Variable">@</span>topic</span><span class="EmbeddedSourceBright">)</span> <span class="EmbeddedSourceBright">%&gt;</span></span> | <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> link_to <span class="String"><span class="String">"</span>New Topic<span class="String">"</span></span><span class="EmbeddedSourceBright">,</span> <span class="EmbeddedSourceBright"><span class="Entity">new_topic_path</span></span><span class="EmbeddedSourceBright">(</span><span class="Variable"><span class="Variable">@</span>topic</span><span class="EmbeddedSourceBright">)</span> <span class="EmbeddedSourceBright">%&gt;</span></span>
</em></pre><p></p>
 
<p><em>Which (also mentioned before) just provides us with links to creating new replies for the current topic or creating a new topic.</em></p>
 
<p><em>Finally we have the long-spoken-of post partial:</em></p>
 
<p><em><b>app/views/posts/_post.html.erb</b>
</em></p><pre class="twilight"><span class="line-numbers"><em> 1 </em></span><em> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">table</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 2 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">thead</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 3 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 4 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span> <span class="MetaTagInline">rowspan</span>=<span class="String"><span class="String">'</span>2<span class="String">'</span></span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 5 </span> <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="Variable"><span class="Variable">@</span>post</span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">user</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">login</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">br</span> /<span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 6 </span> Posts: <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="Variable"><span class="Variable">@</span>post</span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">user</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">posts</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">size</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span>
<span class="line-numbers"> 7 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 8 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>#<span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> post_counter <span class="EmbeddedSourceBright">%&gt;</span></span> - <span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="Variable"><span class="Variable">@</span>post</span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">created_at</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">strftime</span></span><span class="EmbeddedSourceBright">(</span><span class="String"><span class="String">"</span>%d/%m/%Y %H:%M:%S<span class="String">"</span></span><span class="EmbeddedSourceBright">)</span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 9 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 10 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">thead</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 11 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">tbody</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 12 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 13 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">&lt;%=</span> <span class="Variable"><span class="Variable">@</span>post</span><span class="EmbeddedSourceBright"><span class="EmbeddedSourceBright">.</span><span class="Entity">text</span></span> <span class="EmbeddedSourceBright">%&gt;</span></span><span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">td</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 14 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">tr</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 15 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">tbody</span><span class="MetaTagInline">&gt;</span></span>
<span class="line-numbers"> 16 </span> <span class="MetaTagInline"><span class="MetaTagInline">&lt;/</span><span class="MetaTagInline">table</span><span class="MetaTagInline">&gt;</span></span>
</em></pre><p></p>
 
<p><em>Which renders a pretty table for every post we have in the topic. The keen observer would have spotted <span class="term">post_counter</span>
in use in this partial; and even keener observers would've noticed it
appears mysteriously with no previous definition. This is one of the
bonuses we get when we render partials with collections of objects: a
counter for the objects. This counter simply increments every time a
new post object is rendered and gives it to you for free to use as you
please.
</em></p>
<em><br><br>
 
<span id="fr"></span>
<span id="fl"><a href="controllers.html">« Controllers</a></span>
 
</td><td id="right">&nbsp;</td></tr>
<tr><td colspan="3" id="bottom">&nbsp;</td></tr>
</tbody></table>
</div>
</body></html>