Livro Ruby on Rails 2.1

124

description

/%012%34%52%6/7/ 2+?9)@&%A&9%B(9*&+%C9('

Transcript of Livro Ruby on Rails 2.1

Page 1: Livro Ruby on Rails 2.1

!

Page 2: Livro Ruby on Rails 2.1
Page 3: Livro Ruby on Rails 2.1

!"#$%&'%!()*+%,-.

/%012%34%52%6/7/

89):;)9(%2<)=>&

2+?9)@&%A&9%B(9*&+%C9('<&!;D)+(<&%A&9%E(9?&+%F(A(GH+

Page 4: Livro Ruby on Rails 2.1

!"#$%&'()*+*,--.*!/%0"1*2%/34"5*6"4"1*"1*4&%7&)"1*%717%8/4"15

9%&:7&%/*74&;<"=*>?3("*47*,--.

!/%0"1*2%/34"@&)7=*AAA53":74"B"'"5C":

D/%C"1*6/#/BE1@&)7=*AAA5&:#%"87&)5C":5F%G7:#%71/G)/#/B"1

Page 5: Livro Ruby on Rails 2.1

!"#$%&'()*

+,%-(.&/0(

!"#$%"&'($)"$*+,$)-$./&0"$)-$1223$4(%5)$6-57-*-5-#$6(7,,"7$&(78"/$9/:&5;(*-7'-$"$<#(*-="#>$?/:@$"7$?(5&,A$B/-$0(%5(,5)"$-C'#(D)"$)-$/*$,"<'=(#-$;0(*()"$E(,-;(*9F$G(5,$)-$'#+,$(7",$)-9"5,A$7"$)5($H$)-$)-I-*:#"$)-$122H$"$?/:@$"7?(5&,$;0-J"/$($,/($%-#,K"$1F2$;"*$)5%-#,(,$(&'-#(8L-,$5*9"#'(7'-,F

4-$&M$9(#($;M$,-$9(,,(#(*$,-5,$*-,-,A$-$7-,'-$'-*9"$*(5,$)- *122)#-(3-"4".(-56 )"$*/7)"$'")"$;"7'#5:/5#(*;#5(7)" *722)#"%8956F$N$0".-A$O$)-$./70"$)-$122P$"$?/:@$"7$?(5&,$;0-J($Q$,/($%-#,K"$1FOF

4-$(;"#)"$;"*$4(%5)$(,$9#57;59(5,$7"%5)()-,$7-,'($%-#,K"$,K"R

S T5*-I"7-,S 45#'@$'#(;>57JS U-*$4-9-7)-7;5-,S V(*-)$,;"9-S WTXY:(,-)$*5J#('5"7,

X(9D'/&"$OR$Z7'#")/8K"

[

Page 6: Livro Ruby on Rails 2.1

! "#$$#%&'(')*+,

-(%(&($.(/*0(%&1.&*+2$(/(%&(&+13(&3#%2415&6&1&7#&2#89%#:

!"#$%&'()**$+)%*'

!"#!$%&'(%)*+,

;1&<(%'12&=(9(>?2&@.#&6&1&'1A(.$1%&7#2$#&/*3%1B&C#&+41&D122#&91%&#/#&(')1&@.#&31'E&+41&#2$(%*(&/#+71&*2$1B

;1&F(+*#/&G19#2&@.#&D#0&.8(&/*+7(&'(9(&9(%(&#2$(&#7*H41B

;&$17(&(&'18.+*7(7#&I%(2*/#*%(&7#&J.IK&1+&J(*/2&@.#&'1/(I1%1.&7*%#$(&1.&*+7*%#$(8#+$#&'18&#2$#&/*3%15&'18#+$(+71&12$#L$12&+1&I/1,&#&7(+71&2.,#2$M#2B&N&'181&2#89%#&'12$.81&7*0#%5&1&8#/)1%&71&J(*/2&6&(&'18.+*7(7#O&P1+$*+.#8&'%*(+715*+3#+$(+71&#&9%*+'*9(/8#+$#&'189(%$*/)(+71BBB

J.IK&1+&J(*/2&QBR&A&S&@.#&)T&7#&+131U

V

Page 7: Livro Ruby on Rails 2.1

!"#$%&'()*

+,%-./0/,(12

!"#$%&'(")($*+,"-"./0"$0/0,0",("/01(0/(2%*"*34(%*5+(60$&*206"7*34($%5+(60%&*206"/011&28"609(+:;"+(<1*2<='(6"1(60&2%(+*1(+03&6&,0,("(2%+("0"016&$0>?*"("*"302$*",(",0,*<"("1(60"03<%+0>?*",*<",0,*<@"7A&B&1(,&0:

3)456373)894

:;#1/<<=/<)>()?@%(2()<&?

#8*+0"1*,(/*<".<0+"(C1+(<<D(<"(/"/-%*,*<",("$=6$.6*",* +,%-./0/,(12;"$*/*"2*"/-%*,* <&?;"1*+"(C(/16*@

!"#$%&'$()*+,-.-/0"+1

E01F%.6*"GH"#$%&'()($*+,

I

Page 8: Livro Ruby on Rails 2.1

!"#$%&'()*+)*%$#)%+)*,&-%()*-)*./#)-)*01.

!"#$%&'#(&#$")*&'+,'&#-$./")0,$/#1%"2,#$,$23*,0, 01. 0, !2#34$5$2)%- 4"'"$5"65/6"'$"$#,2"$0&$/2"$0&*&'2+)"0"5,6/)"$4"'"$*,0,#$,#$'&7+#*',#$0&$/2"$*"8&6"-$&$)&)9/2$'&7+#*',$5,''&#4,)0+"$:#$5,)0+;(&#$&<4,#*"#$)"$&<&5/;=,$0,23*,0,-$,$'&*,'),$4"0'=,$&'" +3">

!,$?"+6#$@>A$,$'&*,'),$4"0'=,$B./")0,$)&)9/2$'&7+#*',$3$&)5,)*'"0,C$3$D>$E&F"$/2$&<&246,G

!""#$%&'($)*+,-.-%"/0 +"#%12&2#%( 34 56737859 !"#$%

6!789:;

71,)%#$*<*),'()*#=%)1>=

H$23*,0, =&08)+$ '&5&8&/$#/4,'*&$:$,4;=, #=%)1>=>$I6&$J/)5+,)"$&<"*"2&)*&$5,2,$, =&08.&+?*@#=%)1>=-$2"#4"'"$"4&)"#$/2$'&6"5+,)"2&)*,>$I<&246,G

".-(( :-;-<2%/ & '()*+,-,(./011234,=-(>)-%? +($,("@2A&2#%(

/%1

".-(( B$,("@2A&2#% & '()*+,-,(./011234,,/.#%;(>&# +)-;-<2%/,/.#%;(>&# +$(/@

/%1

".-(( C(/@ & '()*+,-,(./011234,=-(>)-%? +($,("@2A&2#%(=-(>#%/ +)-;-<2%/0 +&=@#$;= 347+7($,("@2A&2#%(0

?/8K$,)$?"+6#$@>A$L$H$./&$91$0&$),%,M

N

Page 9: Livro Ruby on Rails 2.1

!"#$%&'&#$( )*+,-(./("0&1'&#$(23"'&45+)+6-7 '0.585$%

!"#$%&'()%*(+#%,-)'$./0'

!"#$%&'& 1"#$%&'(+.1-%,21(")*%+'&"+)*#+("%+#,$#"-./&0%+"+"&/12& +#%,-)'$./0'3"4&."%56%+0"57/8*)+0"*-%&"+%0+9$-'5"575#/8&-3"4+#&-")&#51+0")&#"5-%+-"'.+-")8+--5-:

"93(( :9&5$' ! "#$%&'('#)*+,,-./';3(<=3$> !"#$'3"'<"30%(

;3(<=3$> !"#$'3"'(7 !';0#.?; )* !"#$'3"'<"30%(5$%

!";.5"6&-"*6%505--+"+;.*"$";.5"%56<&".#+")8+--5 345'&. ;.5"/&--.*"=1"#$*"&/>"#.*%&-")&6%+%&-(";.5"/&'5"-50"'5;.+8;.50"%*/&("?@";.5"+")8+--5 3%&.").3"-6 /&--.*".#"058+)*&6+#56%&"/&8*#A0B*)&3

C+0+"-5D.*0")&#"6&--&"575#/8&("9+#&-")0*+0"'.+-")8+--5-";.5"05/05-56%+02&".# 3%&.").3"-6:

"93(( @50(#$ ! "#$%&'('#)*+,,-./';3(<=3$> !"#$'3"'<"30%(7 !3( )* !"#$'3"'

5$%

"93(( A.(&$5(( ! "#$%&'('#)*+,,-./';3(<=3$> !"#$'3"'<"30%(7 !3( )* !"#$'3"'

5$%

7'-#%& 5 8,#5&'## 5-%2&"058+)*&6+'&-")&#"+"#*6<+")8+--5 345'&.("+%0+9$-"'+"%+,58+ 3%&.").3"-6("&."-5?+"5."%56<&'&*-"%*/&-"'5")&6%+%&-("&-"/5--&+*-"5"&-"'5"65DA)*&-3"!"/0&,85#+"$";.5"*-%&"62&"9+*"B.6)*&6+0("95?+"&";.5"+)&6%5)5";.+6'&%56%&"05)./50+0"+8D.#")&6%+%&:

E+/F%.8&"G:"H)%*95I5)&0'

J

Page 10: Livro Ruby on Rails 2.1

!! "#$%&'()$&*+,)$-.'/(01&'20'.! "#$%&'()*##+#,-./.01)23'45%66+#).1+#'4'7).8058.9':5;#<,=>,! 2(-?055'#)430@2A49':5B,-C(9(+D(-9':E5F,-6+@:&+#6821

!"#"$%"&'#$()*+$%,-.(+-"#$*'#'/+)$0'$,)"#$"$+123+ !"#$%&'()*+'4$5"/+)$"6*'#"#$-+))"$.6"))' ,-.'/)7

0#2.. "#$%&' G "1)23'H'1+#A,,I05'32.452&6 ,7%17#%401&'20'.8

,'3-19:3 ;! ,01&'20'402-*.8,.19-0% ;! ,01&'20'.8,.19-0%4'67% ;! ,7%-.1&

32.452&6 ,<9.$&%..401&'20'.8,'3-19:3 ;! ,01&'20'402-*.8,.19-0% ;! ,01&'20'.8,.19-0%4'67% ;! ,<9.$&%..

%&*

8+*'$9,'$":+#"$*'/+)$0,")$%+#/")$0(%'#'-*')$0'$#'.,1'#"#$-+))+)$.+-*"*+);$+-0'$',$0'(<+$.6"#+$9,"6$*(1+=!"#$%&'()*+'>$0'$.+-*"*+$')*+,$')1'#"-0+4

"#$%&'()$&*+,)$-.'/(7%17#%401&'20'."#$%&'()$&*+,)$-.'/(<9.$&%..401&'20'.

01234(5,673

?$:'/ !"#$%&'()* %+($(-.+#1+#"0+$"+$@"(6);$/")$.+/$,/$-+/'$0(%'#'-*'7 /89':("&#+'4

!"#"$'-*'-0'#$+$9,'$()*+$".#').'-*+,$0'$-+A+$"+$@"(6)$A'B"$+)$'<'/16+)$"C"(<+7

@,CD$+-$@"(6)$E4F$G$?$9,'$HI$0'$-+A+J

FK

Page 11: Livro Ruby on Rails 2.1

!"#$$ %&'(!") ! "#$%&'('#)*+,,-./'*#+),-$!./) 0/12"($3),4 0!.*,('(.*$ 56780/12"($3), 56 '&1)9*#+),-$!./) 0!.*'#(*(*:-'3)-")'')&-#4 0!.*,('(.*$ 56 ;2.,<7=>?@7AB#BC;

)*,

%&'(!")D/12"($3),D/#:(*#')E0/#:) 56 FG%&'(!")D/12"($3),D!.*'#(*(*:-'3)-")'')&-#D!.1*'%&'(!")D!.*'#(*(*:-'3)-")'')&-#DH(*,E0H(&$'G%&'(!")D!.*'#(*(*:-'3)-")'')&-#DH(*,E0#""4 0!.*,('(.*$ 5678I9G

!"#$%&'(#)*#+,$-,#./#/'0")" !"#$%&'() 1-,-#,*0",%-,#"(#1"(0(#23#1.45$+-)"(6#*(0".#.(-%)"#" *+,()-&./!( 1-,-7-8*,#$(0"9#:-(#"#/'0")"#'#./#1".+"#/-$(#,"4.(0"#)"#;.*#$(0"9#<*2-#/-$(#-5=.%(#*>*/15"(#)*#+"/"#*5*#1")*#(*,#.(-)"?

*#+),-$!./) 0J&('')*-2)H.&)47"#+2,#787K'(+)K8 0!.*,('(.*$ 567LAJ&('')*-.*7M7NA47'(+)O79

9

*#+),-$!./) 0#*.*<+.1$-)P')*$(.* ,.,)H .*)F

)*,)*,

*#+),-$!./) 0*#+),-)P')*$(.*4 0)P')*, 56 Q#+),@P')*$(.*

*#+),-$!./) 0+1"'(/")-)P')*$(.*$40)P')*, 567LR1"'(/")@P')*$(.*SJ.4 R1"'(/")@P')*$(.*T*)O

@-1A0.5"#B?#!+0$&*C*+",)

DD

Page 12: Livro Ruby on Rails 2.1

!"#!$%&'(%$)"&*#+',"(+')(,-'./*',!0'%#

%1234(567835 !"#$%"&'()*%*+"$#),'")&,+-+..%&,+"&'"/%)0."1234"$%."%56."#.%-"5'-"#$",+$5'"+.,+"-+7#-.'4"('78"5'*+*+.7'9-)-":#+"7-)%-",+.,+."5%-%"+.,-#,#-%."$%)."7'$50+;%."5'*+".+-"$#),'"*<=)7)02

>%$'."5+?%-"#$"+;+$50'@

!"#$$ %&'() ! "#$%&'('#)*+,,-./'*#+,-.$!/0, 1!/"/(,-23"#+4-#3536!/"/(65 1!/*-')'/*$ 7835 1!/"/( 783!/"/(3939

9,*-

A'$'"7-)%-"#$",+.,+":#+"(%0)*+"%"?+-%BC'"7'--+,%"*'"+.7'5'D

E%-%"=%7)0),%-").,'"=')"7-)%*'"'"$!,'*' 897:;*78<=7>54":#+"5+-$),+"+;%$)&%-"%."'5BF+.":#+"+.,C'".+&*'"#.%*%."&'>1234*567832"E%-%",+.,%-"'"+;+$50'"%7)$%4"5'*+-<%$'."=%G+-"%..)$@

!"#$$ %&'():,$) ! 0'/$,,12%$-,; ),$).!/"/(,-.$!/0,(,-.$!/0, 7 5 1!/*-')'/*$ 7835 1!/"/(,- 78 <(,-< 9394"=,.$!/0, 7 5 1!/*-')'/*$ 7835 1!/"/(,- 78 <4"=,< 939#$$,().,>=#"3(,-.$!/0,2 %&'()?!/"/(,-@<(,-<A?$!/0,./0)'/*$#$$,().,>=#"34"=,.$!/0,2 %&'()?!/"/(,-@<4"=,<A?$!/0,./0)'/*$

,*-,*-

/#9H"'&"/%)0."123"I"J":#+"KL"*+"&'('D

31

Page 13: Livro Ruby on Rails 2.1

!"#$%&%"'(%()%#$%&%"'

!"#$%&'('" *+,-./.+0) *+,-./.+01) 2.,-./.+0 * 2.,-./.+01 (' 3,0*4.$.,5-2 +*,*-*+.$#$./"#0$1.+2$*&+'#,'$'#'1,/'3.45#6."#7*+"8*"#.3&*+/'+*"#('#9./4"#7',:#1'(/.#0".+#*"&*"#$%&'('"#1.+.#.0$*3&.+#'0#(/$/30/+#'7.4'+#(*#0$.#,'403.#*$#;#<0$=5#>."#.#1.+&/+#(*"&.#7*+"?'#7',:#1'(*+@#*"1*,/A/,.+#'#7.4'+#.#"*+#.(/,/'3.('#'0#"0-&+.B('#"*(*"*C.+5#D""/$E

!"#$%&'()*+&%,%*-./0!1)*-23 45!"#$%&6(7%+&%,%*-./0!1)*-23 65

6'#*F*$14'#.,/$.#*"&'0#"'$.3('#G#H#1'3&0.I?'#.&0.4#('#C'J.('+#;#*#"0-&+./3('#K#(.#1'3&0.I?'#.&0.4#('#C'J.('+#K5L'$'#*"&*#1.+2$*&+'#%#'1,/'3.4)#'"#"*0"#,M(/J'"#.3&/J'"#3?'#"*+?'#.A*&.('"5

6!")

#5+2*0*5+7

D#1.+&/+#(*#.J'+.#%#1'""B7*4#1."".+#0$#'-C*&'#,'$'#1.+2$*&+'#3'#$%&'(' 8*+2 (*#0$.#,4.""* 3,0*4.$.,5-25#N*C.#*"&*,."'#,'$'#*F*$14'E

+"#22 8++19*- ! "#$%&'('#)*+,,-./'+1,!12%7:1; 0<#"#*+%3 0+"#22:*#,% => ?@1*%$?3 0,#!!)*A => BC/<#"#*+%D#,19*-5

%*7

6*""*#,."')#7',:#1'(*#1."".+#0$#'-C*&'&5+.9 ,'$'#1.+2$*&+'#3'#$%&'(' 8*+2 (.#,4.""* 3,,5:+0)#.""/$E

L.1B&04'#KE#D,&/7*9*,'+(

;O

Page 14: Livro Ruby on Rails 2.1

!"#$%& ' ())*$++,%*- ' ./01.2**#$%&345%678!99: 8*#%65&5#%; '<=> 8?!9!%*, '< @#%,-3%,A7!"#$%&:=*$++,%*-B=CB

!"#$

!"#$%&'(%$)'*+%,'-$.-%($%)/0%-$"(1-$')/(%*'(/-$)%(%$)('2.(%($*%*'-$.-%0*'$'$,#"'*' %&'( *' )*$&+,-,*./(3 0%&/#$40"11 /$'$)(5)(6'$6*$*'$'78/"'$90/-"/$2%-'$0:'$.-%,'-$.,$')/(%*'($/-)/26;62'4$,%-$%$;%<"%$*/$.,$-6&06;62%$=./$/-"%,'-)%--%0*'$'$6*>?

!&'(%$"/(/,'-$.,$=.%("'$')/(%*'($' 01"#$?$@/8%$%<&.0-$/A/,)<'-3

D,+;#%345%6789!;&BD,+;#%345%6789!;&: 8*#%65&5#%; '<=E .$;,+F%!",='=G.:=$;,+F%!",HBD,+;#%345%6789!;&: 8#+6,+ '< .*+,!&,6F#%=1I0J.: 8#44;,& '< (B

B%(%$/0"/0*/($2','$/--/$,#"'*'$;'6$6,)</,/0"%*'$7%-"%$'<C%($.,$*'-$-/.-$"/-"/-3

6,4 &,;&F45%6F9!;&9!;& ' 1,K,9#L,+345%6 89!;&!;;,+&F,M$!9=9!;&: 1,K,9#L,+345%67845+;&: 8#+6,+ '< N56=6,;*NB

,%6

)11

D$,#"'*'$/-"E"62' "11 #$.,$%<6%-$)%(%$'4$"%,7#,$/-"E"62'4 %&'(20"113?$FA/,)<'3

O#L5*3!99 P=,M$5K!9,%&,=!# O#L5*345%678!99B

G.7H$'0$G%6<-$I?J$K$D$=./$CE$*/$0'L'M

JN

Page 15: Livro Ruby on Rails 2.1

!"#$%

!"#$%&'&"()%*%+,& &"#$% $"-#"./+.)"0.1."&2"%.#3$#"()%*%+,&2 &"'()*&"#$%+4"56(#0/&7

!"#$%&'$()* +,-./$012-3*-,1" !"#$%&'$3456'$()*7

,-$%

!"#$%&'&"()%*%+,& .-$% $"-#"./+.)"0.1."&2"%.#3$#"()%*%+,&2 &"'()*.-$%+4"56(#0/&7

!"#$%&21)* +,-./$012-3*-,1" !"#$%&'$345621)*7

/01234540567843405!9:085;5,1085;65216;3<0=4>;

!)"#$%&'&)"#(8,+&8.'&)".,+#."%.#3$#"9-8,+&8.#"(# '-?@(<$ABC@$4":#.;+8("<-("(-",1+(+"-# '-?@(<$ABC@,=.#.'& #@A@'%2"(8%>&"(-"0&'(1(+"9.?(1"+)%&7

#")*&%"88-3*)&(-%-3*&21)*

;1D;:5,41392D

@.1."(60/+,.1"()%."8&A."9-8,+&8./+'.'("A&-"01(,+).1"#&)%1.1"8."01*%+,.4"B.#&)"0(;.1",&#&"(6(#0/&"&",C'+;&".3.+6&7

9/*:"(&'$3456122; 6$3%2/4- <=,>6#")*); 6%"88-3*)?7

D.0E%-/&"F7"G,%+A(H(,&1'

IJ

Page 16: Livro Ruby on Rails 2.1

!"#$%&'()*+,$&%-(&.*"/%0"(&+(&#(1*2( !"#$%&'3&-("&0+42%0+,$&+(&-0+5(&/%*67&("&#(1*2(" (%'#' * )%**+,#'36*2(40$+(,$8("&.*2(&4$2%+( !"#$%&-./9&:(6(&*+#*+,*6&-*25$6&;*<(&( !"#$% =*6(,(&.*2$&>(02"?

!"#"$%&'()*+,-./0. 1! (23+24&'()*+,-.5+6&(603&(. 1! (23+74&'()*+,-.'80&(603&(. 1! (23+948*,(,-./0. 1! (73+248*,(,-.&'()*+3/0. 1! (73+748*,(,-.5+6&(603&(. 1! (73+948*,(,-.'80&(603&(. 1! (73+:45*;;6<(,-./0. 1! (93+245*;;6<(,-.&'()*+3/0. 1! (93+745*;;6<(,-.5+6&(603&(. 1! (93+945*;;6<(,-.'80&(603&(. 1! (93+:

=>?@&'()*+,#"=% ?A%"> B?CD 8*,(, ?D 8*,(,-&'()*+3/0 E &'()*+,-/0#"=% ?A%"> B?CD 5*;;6<(, ?D 5*;;6<(,-&'()*+3/0 E &'()*+,-/0

@-(&A+04(&/%*67&BCD&'$0&460(,(&4$+#*+,$ 0%.,' *+#6*&("&#(1*2(" !"#$%&'3 (%'#' * )%**+,#'9&E5(-(-$"&0"#$&,*(&%/"#%1)!&#+'.!,%9

F4$+#*4*&/%*&0"#$&+*-&"*-.6*&G&.*6'$6-H#04$3&.$6&0"#$&'$0&(2#*6(,$9&I*"#(&;*6"J$&,$&>(02"&($&*K*4%#(6&(&-*"-(&.*"/%0"(+(&42(""* 2"#$%&3&$&>(02"&%"(6H&%-(&$%#6(&*"#6(#G=0(&.(6(&6*4%.*6(6&$"&,(,$"&,("&#6L"&#(1*2("9&F$&0+;G"&,*&%"(6&(.*+("%-(&/%*67&4$-&#$,("&("&#(1*2("&6*2(40$+(,("3&*2*&%"(6H&#6L"&/%*67"&-*+$6*"3&%-(&.(6(&4(,(&#(1*2(9&M*<(&$&6*"%2#(,$&+$2$=3&(.N"&*K*4%#(6&$&-*"-$&4N,0=$&(40-(?

!"#"$% F =>?@ .&'()*+,.!"#"$% 8*,(,-F =>?@ .8*,(,. GH">" I8*,(,-&'()*+3/0 CD I7JJ!"#"$% 5*;;6<(,-F =>?@ .5*;;6<(,. GH">" I5*;;6<(,-&'()*+3/0 CD I7JJ

>%17&$+&>(02"&O9P&8&Q&/%*&5H&,*&+$;$R

PS

Page 17: Livro Ruby on Rails 2.1

!" !"#$%&$#! #$%&'"%$%&()('*+",&+,-%&.*(,/%&%0123(%&4&1"0%&,520#$&.*(&()('*+",&*1"&670'"&.*(,/&808"7+(9

'()*+,-./*

:&14+$#$ 012%345.6% ;$0&1$#0;0'"#$&2","&2(,10+0,&$&*%$&#( 7819138136:;<:78156&%= ( 7812161 (1&"%%$'0"<=(%9

>)(123$%?

!"#$%&'()$ *+,)-$.(+//."''!"#$%&'()$ *+,)-$.(+//."''0 */"1"%/"%) 23 */"').$4!"#$%&'()$ *+,)-$.(+//."''("5).+0 */"1"%/"%) 23 */"#")"0

*6#+''(%+7" 23 89,)-$.9//."''8

>*)?@*A>BCD:EA)

:%&@(32(,%&2","&ABC%&2$301D,;0'"%&%E$&14+$#$%&*%"#$%&2","&,(%$3F(,&#(&*1"&;$,1"&1"0%&07+(308(7+(&*1"&,$+"&7$1("#".*"7#$&F$'-&+(1&*1"&07%+"7'0"&#(&*1&1$#(3$&#$ FG6$H1A1G%&89

>%+(%&14+$#$%&%E$&6+(0%&.*"7#$&F$'-&.*(,&8(,",&*1"&ABC&'$,,(+"&2","&*1&,('*,%$ A(-/IJ2 %(1&2,('0%",&%"G(,()"+"1(7+(&.*"3&4&$&+02$&#$&,(80%+,$&(1&.*(%+E$9

:&;*7'0$7"1(7+$&4&G(1&%0123(%H&F(I"&"38*7%&()(123$%&J7$%&'$1(7+5,0$%&(%+E$&"%&'@"1"#"%&(.*0F"3(7+(%H&7"%&F(,%=(%"7+08"%K?

."6$./ 2 9.):6#";<:%/=*<:.')>1$#47$.1-:6(,.#=."6$./> !"#$$%&'()*+,-&*.&+)/&01

."6$./ 2 ?$77"%);<:%/=*<:.')>

L"2M+*3$&N?&O'+0F(B('$,#

PQ

Page 18: Livro Ruby on Rails 2.1

!"#$%"&!'()*+&#,&-)"&./ !"#$$%&''()*+,-./-(%&-01

! (.($*2'34'$-(%&)5(%($6,2)0&$4$,'$)&7&$-(89:*-&&-)"&. 0 1"%%-2342-5!"#$%"&!'()*+&#,&-)"&./ !"#$$%&''()*:+,-./1

!"#$%&'"%(%)*+(,(%-".(/0"."%(%-"123+-(%'3$,(%"%)(/+$%$%-(+$%.(--"+$)"/+"4 !"#$"%&'"#()'*"# " +,-"#.,*"#+$)5*)%36(%3'7(-+$,(38

!"#$%"&!'()*+&#,678.%(29 :8&3()#-9 :)"%%-23;/!"#$729$0(7&.7(-;8.%(2*8&3()#-*)"%%-23*+&#,:8&3()#-9 :)"%%-23/

!(.9%+$)5*)%7(,"%'3$-%7-":2;(3%.()( +"/< "%0$ " 1('-,$$"%<%="#$%$>1'/3%";")7>(38

-.(3*!"#$%"&!'()*!83',:!"<3/!<#$=>&:*:=?=(09*

="&%833-.*!"#$%"&!'()*!83',6:!"<39 7!.=;/!<#$=>&:*:=?@>0A

2345678!593!:8;&689&235<8!4=

?)$%/(=$%(7@6(%"3+A%7-"3"/+"%/(3%-">$.2(/$)"/+(3%"/+-"%)(,">(34%B:2)%,"%2)7",2-%&'"%3"'3%-"123+-(3%7(33$)%3"-$>+"-$,(3<%7(,")(3%'3$-%$%(7@6( >'",%(+?@ $(%$33(.2$-%)(,">(34%!"#$%$>1'/3%";")7>(38

'8<*%82$ 7&-!"&3<9 7&-8."2#$ 0> 3&+-

'8<*"2- 7?"<<9 7&-8."2#$ 0> 73&+-

?-#"2@<*3" 7!&"A-)39 7&-8."2#$ 0> 3&+-

C'5D%(/%C$2>3%E4F%G%H%&'"%0A%,"%/(=(I

FJ

Page 19: Livro Ruby on Rails 2.1

!"#$"%&$'()*%+#$,*$-"%. /0",(+*12(#3 /1("&*%). 45 ,16(

!"#$%&#'$%(&%'&)"*#'$)%'&+)%$"*#,%'&-.%&+%,").%&'")&/0$")/,%'1&2"&3%45&$"-$/)(&$")6&78/&"94"''.%&,%&$#+%!"#$%&'&"()*++'&,*-./0'&"()* ,#'+/)/,/1

-12345-6-12!667583915!3:1292'93-;97583915!3:1

:*%)/&$"8%'&,%#'&-%3%'&8;$%,%'< ,**7#$<&=#,<>= " )&<(%&7#$<&=#,<>=(&=7"&4)#/&"&)"8%3"&>)"'+"4$#3/8"-$"?/'&4%07-/'&," #$<&=#,<>=1&@"A/&78&"9"8+0%<

&(7 #()7869"&&$,2-(#,"-9# /7((&#"&&$,2-(#,"-9# /61)#

(%&

&(7 #()78&*:%1(-*;($,2-(#,"-9# /61)#1(-*;($,2-(#,"-9# /7((&#

(%&

?!@?A@!58-B1

B !"#$%&'&"()*++?,/"C/,#$(.= 87,%7&78&+%7=7#-C%&+/)/&/4"#$/)&/0;8&,%&-%8"&,/&4%07-/(&$/8D;8&%&-%8"&,/$/D"0/1&E'$%&;&F$#0&=7/-,%&$"8%'&)"0/4#%-/8"-$%'&"-$)"&$/D"0/'&=7"&4%-$;8&78/&%7&8/#'&4%07-/'&4%8&%&8"'8%&-%8"1&B'8;$%,%'&/G"$/,%'&'.%&8;$%,%'&4%8% =C< %7<,D$<C< ,% !"#$%&'&"()*1&H"'78#-,%(&3%45&+%,"&G/I")&,"'$/'&,7/'G%)8/'<

J/+K$70%&L<&:4$#3"H"4%),

MN

Page 20: Livro Ruby on Rails 2.1

!"#$%&'()!#*+%&,*'(-!.,-"-/0,12!"#$%&'()!#*+%&,*'(-!.,-"-/3)!#*+%&,*'(,132

!"#$%&'&"(')**+!,&-"'&!#&.!"&$#!.+/("(,

!"#$%&'()%#'*)%&+(',)%#*)(#)#(-&),) !01234'40567**+894-:4; .+$#'*$/&'#)#+%)#,$#01)*)%#2'#*3/'45)#,$#+(#2)6)3$7/%&3)8#97)3'#:),$()%#;'<$3#)#($%()#*)(#)#(-&),) 064814=

! "#$%&'()*+)(,-./(0)*1%&'()*+),2(3()4%#%)$&5(#+%#)1.*1)%/#$,*/(164'*&()&*!#*/05,&'#67!-* 89 :;!-,*:2 1% <"<"(,'6!1-,7 8 5!='*

*71

>'(0-(#:),$()%#+%'3#)#($%()#(-&),)#:'3'#*3/'3#6"3/)%#)0?$&)%#,$#+('#6$<=

! "#$%&'()*+)7##%8)'.)&(9(1)(,-./(1)*1%&'()*+),2(3(0! (&'.)(),2(3():).;.3*/%'()*+%)9.<)4%#%)3%'%)(,-./(=4'*&()&*!#*/>?05,&'#67!-* 89 :;!-,*:@AB?05,&'#67!-* 89 :;*&*-C:@D2 1% <"<"(,'6!1-,7 8 5!='*

*71

@%&)#&'(0-(#;+2*/)2'#:'3'#'%%)*/'4A$%=

!"#$%&(E%'#'()&*!#*F/0#,#=* 89 3G*HB%7BI1+*32B?<E<BE(J%1C 8 3K%&*B)%%=B'#"55F3@

! (*

!"#$%&(E%'#'()&*!#*F/0#,#=* 89 3G*HB%7BI1+*32 1% <E<E(J%1C 8 3K%&*B)%%=B'#"55F3

*71

B+0C#)2#B'/1%#D8E#F#G#.+$#H"#,$#2)6)I

DJ

Page 21: Livro Ruby on Rails 2.1

!"#$%&'(#)*&

!"#$"+,-./0,123 %#&'()*(#+')*$#,),-./)0-1'#,)0')2$34$*-3+')0')5$#2,)6789)*$,)$2+-"$")(*$)+$:-2$)(,$30'+,-./0,123&'3+#3('(),-30')0$)%'"*$)$3+#;$9)3$0$),-./7

<')5$#2,)67=9)$2+-"$")(*$)+$:-2$)+$*:>*)>),-./9)&'*)')3'?')*>+'0' 45/2-6'0/7867)@-A$)(*)-.-*12'B

!"#$%&'(#)*& +,-.&/0 ./ 1(1(2(-3&0(#340 ! "#$%$&'"(")(%&*+'")(%,-".-#/".(-(+0#".-#/".(2)&*/$%0'(/ +%/#( ! "#$%$&'"("(%&*+'"(1&"./$#(2$'.-1-,3(20(5-$% +$#3&6 +&3#-*6 +*-3-( 78 9: ! "#$%$&'"(#+")(%&*+'")4('"5-(-(-5"$*(25&3/,& +$#3&6 +&3#-* ! ,-5&6-(")(%&*+'7")('"5-(-(-5"$*

&$.

C(3&#'3$)&'*')' 4.6/06'0/7869)*$,)$')#3?>,)0-)&"#$")(*$)3'?$)+$:-2$9)$1-3$,)$2+-"$)(*$)+$:-2$)-.#,+-3+-9)$0#&#'3$30''()"-*'?-30')&'2(3$,)-)D30#&-,7)@-A$)(*$)2#,+$)0$,)'14E-,)-.#,+-3+-,B

!"#$%&'(#)*& +(#)*& ./ 1(1(2!/*;3$ ! %,$"(+5"(%&*+'"()$50*-)8(9:4(.8%&*+5'24'"5-;(4).,$'13(2-$.&< ! <#$%$&'"(+5('&6&(='#$%-(>(."?-*"(2(-3&0(#340(2!"#$%& ! 5+#"("(#-@$'$AB&(#"(%&*+'"8(9:4(.8%7"'1-24'"5-;(4).,$'1;(4*$5$.(CD(EF3(2!"#$%&'.&=#;*( ! 5+#"(&(6"*&,(0"#,B&(#"(%&*+'"8(25&$#3& ! 5+#"(&('&5-(#"(%&*+'"(25&=&5&$!&0(2)&*/$%0'(/(20(5-$%(2(&<((2-$(&%&5(2=*/#((2.&!-3#*(2.#(&(-3&

!$1D+(2')6B)F&+#?-5-&'"0

6=

Page 22: Livro Ruby on Rails 2.1

!"!#$%&!'$(!"!#$%!")'!%!"*#+',-!"*../%'+!",%$.0%!",%$.0%1,%2%,%+3%&!",%$.0%1*%/.+4&1!.!",%$.0%1#+)%5!",%$.0%1!#$%&!'$(&

%+)

!"#$%&'()*+$,

!"#$%&'#&(%)*+&,#-./#+&$%+0$.%$&%*0.$%12.+&3.)0%+&'# -./012#2.3454&5#-./#+&+%6.$&+.&7/&#68.0#&3#)&%*0.$%-#&#7&'9#&.+.&3#)&%*0.$%-#&,#-./#+&)-.'0)3):%$&#&;7.&/7-#7&.&%0<&/.+/#&3%=.$&7/&:#/,%$%0)>#&-#&0),#&%'0.+&.&-.,#)+4&?%/#+&%#+.@./,*#+A

',!#3/% 6 7,!#3/%"2#+)892#,&!:',!#3/%"3;'+4%)< !"#$%&'()

',!#3/%"!#!/% !"#$*+,-')*',!#3/%"!#!/% 6 =>%?@A#!/%=',!#3/%"!#!/%13;'+4%)< !"#$-./)

! 0)1/2).&$3$4&'3.$&5-).,3.$63$&-.,7/-3',!#3/%"!#!/%1?'& !"#$*+,-')*

! 8)9&$3$&5-)($6)$6)23,($6&$&'-).&:;3',!#3/%"!#!/%13;'+4% !"#$<*+,-')*=$*>)?$+,-')*@

(76B&#'&(%)*+&C4D&E&F&;7.&GH&-.&'#>#I

CC

Page 23: Livro Ruby on Rails 2.1

!"#"$%"&'$(")*$%*+$,$-*#$./#(0*.1$2"&'$34#-,#$(")*$0/.34+$3")4.$4.$403*+456*.$7"$"-8*3"$)*$)94.$:"+#4.1$!"73/7947)")"$&;)/<"$473*+/"+=

! "#$%&$#'()*'&+,-*'.%)'%,'*-/+0(-%,'*&-#/*1%,!"#$%&'(%)!*+', !23'45-+-&#56

! "#$%&$#'()'7*,8'.%)'%,'*-/+0(-%,'*&-#/*1%,'#'()'*9-#,'#'1#:%+,!"#$%&'(%)!*+'- !23';'5-+-&#<'23'4=>+-&#=?'=@#A'>+-&#=6'B

>"3*$?9*$?947)"$"$"-8*3"$,$.40%"@$"$.3439.$)*0*$,$403*+4)"1$2*84=

!"#$%&'(%)!*+',. !23'-/(#!"#$%&'(-!/' !23'-/(#!"#$%&'(%)!*+',. !23'C*&,#

!4."$%"&'$%A$403*+4+$9#$"-8*3"$.*#$9.4+$"$"(*+4)"+ !""#$@$%"&'$(+*&/.4+A$/7:"+#4+$#47940#*73*$?9*$"$43+/-93"$:"/403*+4)"$9.47)"$"$#,3")" !""#%&!'(%)*++%,-!&.(/ B7"$09<4+$)* !""#@$%4/$"$7"#*$)"$43+/-93"C@$%*84$#4/.$9#$D03/#"*E*#(0"=

!"#$%&' 0 1"#$%&'(2$*,342$"-#5!"#$%&'(#$#&'67$&&6%)!*+'8!"#$%&'(#$#&'(9:%!-'8!"#$%&'(#$#&'6%)!*+' !23'45>+-&#5?'5>D>EF56

01234156708139:

F$/#(0*#*7345G"$)* 8*#";6<=>(,"? :"/$"$<47&H"$(4+4$"93+4$7"%/)4)*$34#-,#$#9/3"$/73*+*..473*1

!4(I390"$J=$F&3/%*K*&"+)

JL

Page 24: Livro Ruby on Rails 2.1

!"#$%&#'()*'#+),&-).#*'./*&'*#$%'0.#'/*01%/).#2)*'-#'3/&*',).#4'#04./'450'#,)#)16&/)7#+)*$%&#48)#%.'*#0./)#+'*'#&90/'*'/%'30:';<&.#,&.4&5&.."*0).#4)#1'45)#,&#,',).=

>'.#9&*.<&.#'4/&*0)*&.#,)#?'03.#$%'4,)#&@&5%/"9'-).#)#-A/),) !"#$ &-#%- %&'(#$)$&*+, 6"#&@0./&4/&7#&*'&@&5%/',)#4)#1'45)#,&#,',).#%- -./%01 &-#/),'.#'.#5)3%4'.#,'#/'1&3'7#-&.-)#+'*'#'.#$%&#48)#.)2*&*'-#'3/&*';<&.B

C)-#) /(+'23456$&'! 0./)#+),&*0'#.&*#-&3D)*',)7#&#2)0#&@'/'-&4/&#)#$%&#'5)4/&5&%B#E&6'#)#FGH#(&*',)#')#/&4/'*.'39'*#%-#*&(0./*)#$%&#.)2*&%#'+&4'.#%-'#3&9&#'3/&*';8)#4)#?'03.#IBJK

!"#$%&' ( )"#$%&'*+$,-./+$"0#1!"#$%&'*#$#&' !"#$%&'()*%!"#$%&'*0234'%# !"#$%+,-*$./')0%

! 1/230$/(4/)'5/6$42$/(6'74(38!"#$%&'*#$#&' ( 56'789$#&'5

! 1*9/$3$:;<$=6'/,3$/3$>*60'0('6$3$379*(3!"#$%&'*0!:'!"#$$%?@AB&+$/6('=)*0$:+&$('()*$"$CD*E$&'()*F$GH+.+$',$"$I!

>)/&#$%&#'+&4'.#)#'/*01%/)#'3/&*',)#.&*"#'/%'30:',)#4)#1'45)#,&#,',).B#F&#4&4D%-#'/*01%/)#2)..&#'3/&*',)7#)%&'(#$)$&*+, 48)#&@&5%/'*0'#4&4D%-#%+,'/&B

L'*'#D'1030/'*M,&.'1030/'*#&./'#4)9'#2%450)4'30,',&#9)5N#,&9&#'3/&*'*#'#+*)+*0&,',& 7"+'("89:7,"'$! ,).#.&%.;*,$8!B

! @/6/$J/7')'(/6$/$K4L='3L/)',/,*8;$,<!=&!00'*>!"#$!&?2>-!#'0 ( #"2'

F&#,&.&6'#D'1030/'*M,&.'1030/'*#&./'#2%450)4'30,',&#+'*'#/),).#).#-),&3.#,)#.&%#.0./&-'#'3/&*&#&./'#304D'#4)#'*$%09) !"#$%&'%#%(%)*%+,-.'#,/0-)%*.01,$)2*(.3-4K

?%1O#)4#?'03.#IBJ#P#Q#$%&#D"#,&#4)9)=

IR

Page 25: Livro Ruby on Rails 2.1

! "#$%&%'#()*+,#-#+'*)*.+*.+/01.+/*)0&.!"#$%&'&"()*++,-.&/0-)#$-1230*-#&. 4 #)3&

!"#$%&'()*&')+#)#+,-#%.)/#)0$1'23.2)' !"#$%&'%#%(%)*%+,-.'#,/0-)%*.01,$)2*(.3-4 ,-.$/')1'2).4"#2.2)-3)."205-"')+#3)-+.2)'36"'/' !""#$7).++03(

! 20+01+3%40-+#..%/5+'1)*+$0/60&).(5/5-6& 4 78(88970&).(5/5-6&2":-5;& ! 78+9:$*$:5+:$*$$;:<

! =#.+.0+01+(>*+#&'0-#-+*+#'-%$1'*+1.#()*+*+.%(#&+)0+:7?! 0('>*+,-0@%.*+#A%.#-+B10+A*1+3#40-+1/#+#&'0-#C>*0&).(5/5-6&2<$112":-5;&=0&).(5/5-6& >> 78970&).(5/5-6&2":-5;& ! 78+9:$*$:5+:$*$$;:<

8#)$&')109#2)0+"')#+"#)"0:')/#).4"#2.%&')$&')+#2;)2.+"2#./'7)#)+-.)".5#4.)$&')+#2;)."-.409./.)<'22#".3#$"#=

%&'(()*+,-)*+-./-0)1)*+-*.-&2%3(4

>)./.:"./'2)/#&5%3( /')!<"0?#@#<'2/)10<'-)-3):'-<')3.0+)#+:#2"')$.)A'2.)/#)<20.2)'-).4"#2.2)<'4-$.+)$')5.$<')/#/./'+)-+.$/')0$"#02'+=)B#).<'2/')<'3).)':%&' 67898"7)#4#)/#10$#)+#).)<'4-$.)+#2;)-3 :9!778;"7 8;" '- <8=8;"=)C#D.)-3"2#<A')/')<E/0F'),-#)1.9)0+"'(

"-.& 1$6$#<:&5 ?//@A.6-11$5#BCD1$6$#EFA

<:&5 G//HA$5#BCD1$6$#EFA

G.:H"-4')I()!<"0?#@#<'2/

IJ

Page 26: Livro Ruby on Rails 2.1

!"#$ %&&'()*+,+$-./01+2+-34)

#15#6+$-.7746

#$8

!"#"$%&'"#$("&)$'*"#+,$-"(+)$("./"#$&)0+$/($1(!"#$%&"'( /$-/#$21/$0&.+$3/$'+*14"$)/#5$'#&"3+$."#"$'"3"$'")+6

9:#;-#<-;*1# =-;*1#<$;2#> =?@:9# AB -:C# 8@ D-D

! "#$%$&$'($)*+,,-./-&+$-#,#: =9@1C$;7> =1+2+- AB ' ! )*+,,-./012

! "#$3$&$4($-./-&+$-#,#: =9@1C$;'> =1+2+- AB E ! -./052

! "#$6$&$1%($7-8-./-&+$-#,#: =9@1C$;F> =1+2+- AB 7G ! 7-8-./09:2

! )#$+$;<=>;$(,-*-/$.>;$?;@$-.?;@*+"+($-./0992-&+$-#,#: =9@1C$;H ! -./0992

#$8

7$"3".0"3+#$3+ )'*&#$+,-. 85$%"9&"$"))&(,$+$3+/0,-. "./4")$)/:1&1$"$0/43;4'&"<

1)23145.67,8.8296416:5,;148686<8.14=,;91

7)$%"(+)+)$(=0+3+) >%*;'(+ / ?+@'(#*;&' "'">"($3/$#/'/>/#$("&)$1("$+.?@+,$+$85$'+4A/'&3+ 7*+@+A&<

!+#$."3#@+$/)0"$+.?@+$=$+$B!"#$"%%&'(')* CD7EFF,$(")$-+';$.+3/$(13"#$&)0+$/$#/'1./#"#$)+(/40/$")$'+*14")$21/$)/#@+1)"3"),$+1$+$21/$)1"$&(":&4"?@+$&4-/40"#<

D1>G$+4$D"&*)$H<I$J$7$21/$A5$3/$4+-+K

HL

Page 27: Livro Ruby on Rails 2.1

!"#$%#&'()*+',#-./#'01$'2)#&'#3/*/3)4#) !"#$%"& '#)0 '(")#*+,-)&.,#0'-./#5/36#('47#$%#*8-&/#'44/9

:$(4)#)*('4)2./#;#1$'#)#/<2./ /("0)" &/ 1)2(+*.34( =/8#4'%/58&)9#>)0#-./#0'#<4'/3$<',#</41$'#'*)#-'%#0'458)#<)4)-)&)#%'0%/9

567589:5:;<,<,:<79,=<7>?9@<,;5,=?5AA9,5<,BA56,A@C

?$)-&/#$0)%/0$(0)2. 3/% +%$).!%D) ' A@C,#/ 5D4#E)6)D("0 )4%)@'-)#)<'-)0#/#-/%'#&)#3*)00',#0'%#/+%$).!%D) A!"#$!%&'("!B9#C0(/#5)8#=$-38/-)4#0'#(/&)0#)0#3*)00'0#-/ A@C '0(85'4'%#-/#%'0%/ +%$).!%D),#%)0#847=)*+)4#'%#/$(4/0#3)0/09#DE'%<*/F

!"#$$ %&""'!()&*+(', ! "#$%&'('#)*+,,-./'- '*.!"#$$ %&,)!%&""'!()&*//+(', ! 0)11'#$%)23$'4- '*.

)(', 0 %&,)!%&""'!()&*//+(',1*'2)(',1(34' 5 67893$'4:

)(',5 0 %&""'!()&*+(',16)*.7)(',1).85 *'$)*2.8;48'**)<8=)*>;'82?)8'2#)2$*);8.8#1.//'83$'4

D0()#)*('4)2./#)&838/-)#$%)#-/5)#/<2./#&'#3/-=8G$4)2./#1$'#=)@#3/%#1$'#/ 5D4#E)6)D("0 )4%)@'-'#/#-/%'#3/%<*'(/&)#3*)00'9

H)4)#*8G)4#/$#&'0*8G)4#'0()#=$-38/-)*8&)&'#5/36#&'5'#8-3*$84#/$#)*('4)4#)#0'G$8-('#*8-+)#-/#0'$#)41$85/ ")*'+$)#"),-+.F

9!():';'!&<.//=#$'1$(&<'>6?"">$()>!"#$$ 0 (<?'

H/4#<)&4./#'0()#=$-38/-)*8&)&'#'0()47#*8G)&)9

I)<J($*/#KF#L3(85'M'3/4&

KN

Page 28: Livro Ruby on Rails 2.1

!"#$%$&#'()*+*,-.#./

!"#"$%&'"("$)*+*$*$,-*../ '0123452'6472830 24098+8:;121/1$2/3$3."$&$%34'"$.4%)-/.0

!! "#$%&'('#)*+,,-./'0#)11'#$%)10$.23'4'5%/$/6789/'*/8:;! $*9'

#-!*.#'!<*%&!-=>'#-$?.

53*6("$./$/.'7$/.'3(*6("$8*4-.$"3$(/./6#"-#/6("$*-9"$.":46;"<@;A342;BC1 )*+/,/%$./+$*$."-3=>"$)*+*$'"(".$".)+"?-/%*.1$@*.$A3*6("$./$'/%$3%*$/A34)/$'+*?*-;*6("$6"$%/.%"$)+"B/'"$/$'"("$%36("$,+4*6("@;A342;BC1 *"%/.%"$'/%)"<$#",C$(/.,"?+4+7$D"3$B7$(/.,"?+43E$A3/@;A342;BC1 .4%)-/.%/6'/$6>"$F36,4"6*%<$)/-"$%/6".$6*.$#/+.G/.*6'/+4"+/.$("$8*4-.1

H$)+"?-/%*$&$A3/$A3*6("$./$,+4*#*$3%*@;A342;BC<$/-*$+/,/?4*$3%$6I%/+"1$@*.$"$A3/$*,"6'/,4*$./$(3*.$)/.."*.,+4*../%$3%*@;A342;BC *"$%/.%"$'/%)"<$"3$)4"+$*46(*<$./$#7+4*.$)/.."*.$,"%/=*../%$*$,+4*+@;A342;BC1 /$.J(/../%$,"%%4'$(/)"4.K$L",C$'46;*$3%$%"6'/$(/@;A342;BC1 ,"%$"$%/.%"$6I%/+"$,"%$,J(49".$(4F/+/6'/.1$M"6F-4'"N

O7$/P4.'4*$#7+4*.$F"+%*.$(/$Q'/6'*+Q$."-3,4"6*+$4.'"1$R*#S*$*-936.$)-3946.$,"%$*?"+(*9/6.$(4F/+/6'/.$)*+*$+/."-#/+$/.'/4%)*../1$@*.$46(/)/6(/6'/$("$)-3946$"3$*?"+(*9/%$A3/$#",C$3./../<$3%*$,"4.*$F4,*$?/%$,-*+*<$*$F"+%*$*6'49*.4%)-/.%/6'/$6>"$F36,4"6*#*1

2/$#",C$/.'4#/../$3.*6("$T4'$4.'"$&$)4"+$*46(*<$)"+A3/$)+"#*#/-%/6'/$.3*$/A34)/$'/+4*$*-936.$?+*6,;/.$(/$'+*?*-;"$/)"(/+4*%$,+4*+@;A342;BC1 /%$'"(".$/-/.<$/$#",C$'/+4*$".$%/.%"$,"6F-4'".$6*$;"+*$(/$F*:/+$"$%/+9/1

U"+$4.'"<$"$,"+/'/*%$*-'/+"3$*$,+4*=>"$(/$%49+*'4"6.$6"$8*4-.$)*+*$3.*+$6>"$%*4.$3%$6I%/+"<$%*.$3%*$.'+469$?*./*(*$6*;"+* D#E 6"$F"+%*'"0$VVVV@@WWRR@@221

83?X$"6$8*4-.$Y1Z$[$H$A3/$;7$(/$6"#"K

Y\

Page 29: Livro Ruby on Rails 2.1

!"#$%&'(()%*)'%+,'-&-%.$-%/)0-%1-23"-%+4-$-&- !"#$%&'%()*&+(,-! 5.3%-,$-63/-%5.-'(%()*&+(,-! 78%*),-$393+.1-&-(:%!(('$;%(3%-"<.#$%+,'-,%.$-%$'<,-1')/%+)$%.$%/=$3,)%$3/),;%(3,8%*3'1)%.$ *,../&"0 -1#%-%03,(>)%-/13,'),%3&3?)'(%393+.1-&)%1.&)%&3%/)0)%-1#%-%03,(>)%+),,3/13:

!?-,3/13$3/13%'(1)%,3()"03%)%?,)2"3$-%&3%+)/*"'1)%&3%()*&+(,-!:

@3%0)+A%5.'(3,;%?)&3%&3("'<-,%3(1-%*./+')/-"'&-&3%'/+".'/&)%3(1-%"'/4-%/)%-,5.'0)%3/0',)/$3/1:,2B

!"#$%&'(!)%*+,-+!"-.')%/+0)(/1+.,/%&-()%"#0 2 $(30+

C-$2#$%*),-$%+,'-&-(%/)0-(%1-,3*-(%,-D3%?-,-%E-/&-,E%?3")(%()*&+(,-!B

-(4+5.67/%&-()+781-(4+5.67/%&-()+7."9#

F-?G1.")%HB%!+1'03I3+),&

HJ

Page 30: Livro Ruby on Rails 2.1

!"#$%&'()*

+,%-./0&##(1%

!"#$%&'()**+,#'-')./'"+0&12+'3&'%4,$/5'"0/55&5'6#&$5'&'&7#&859&5'3&':$:0$+#&"/5'*/3,9&5;'<)&'=+,/.'"+85$3&,/3+5'6#&$5*/,/'/*0$"/19&5'&.'>):?'+8'>/$05@'AB$C$*&3$/D

+!23450677892::!8955;25<038<0::=+25::!+>!6>+238<0

2-?/@/ABC(DCB"E

>&#+,8/'+'3$/'3&'E+F&'"+.'+'E+,4,$+'GHIJKIJK@

2-?/@/ABC(DCF//G

>&#+,8/'+'=$.'3/'5&./8/'A3+.$8L+'GHIJKIJKD@

>):?'+8'>/$05'G@M'N'O'<)&'E4'3&'8+%+P

HQ

Page 31: Livro Ruby on Rails 2.1

!"#$%$&'()*(+,-./$.

!"#$%&'()*(+'#"(%",%"-"&#'&.$($(/0&'1(.$(#%0*"-#%"2(3*($)#%'-(,'1'4%'-($(51#0*'(.0'(."(*'%6$7(8)&9$7(-"#"*:%$7.";"*:%$7($(<)"(40"%(,%0*"0%$2

!"#$%$&'()*(0$-.

!"#$%&'(.0'(=>(."(.";"*:%$(?-(@=ABCABC

!"#$%"&(/"#$(1)&$

3-#"(*D#$.$(D(-0*01'%('$ !"#$%2)3-2/"#$7("EF"#$(,"1$(/'#$(."(<)"()-'($ !"#$41)&$ &$(1)G'%(.$(/)-$H9$%I%0$(.$-0-#"*'($,"%'F0$&'12(J$FK(,$."(,'--'%(F$*$(,'%L*"#%$()* !"#$5)&$ $)()*' 6/."&72(J"8'*$-('1G)&-("E"*,1$-A

!"#$%&'($ ) *+,-,""*!"#$%./0123334%"(5/"#$5&'($! "#$%&'($)*$+,-$*...$*/011011$234$5*1011

!"#$%./0123334%"(5/"#$5&'($1*67,89,*4! "#$%&'($)*$+,-$*...$*6011011$7834$51.011

!"#$%'-08("&(#)&/9

M$0(F$%%0G0.$()*(:)G(&$(*D#$.$ '-08("&(#)&/9 <)"(0&/$%*'4'($(&5*"%$(."(.0'-(&$(*K-(."(/"4"%"0%$(."(/$%*'"%%N&"'(<)'&.$($('&$(&O$("%'(0&/$%*'.$2

P',Q#)1$(=A(RF#04"S),,$%#

=>

Page 32: Livro Ruby on Rails 2.1

!"#$%&'#()*"+*,-.-%&"&/"0-#'"*"#,*"+*''&,%&"10#,2*",)*"-&".,3*'/#"0/"#,*"#*"+4#/#'"*"/5%*2*6"708*,2*"10&"9*+:&-%&;#"&/"0/"#,*"<.--&=%*>"9&;#?

!"#$%&' $()(*"+,(&-.(&)%/"&,(&-.01#%*2 34543677 8%,(4$#92:%&:,"&-;036<7 3=

!"#$%&' $()(*"+,(&-.(&)%/"&,(&-.01#%*2 34>45677 8%,(4$#92:%&:,"&-;036<7 3?

!"#$%&'$(#)*+

!"+$#--& !"#$%&'$ @#,4*0"0/",*9*"/5%*2*"* #)*+ 10&"'&%*',#"#"2#%#"+*/*"0/"8*,%*"3$0%0#,%&"10&"'&8'&-&,%#"#10#,%.2#2&"2&"-&@0,2*-"2&-2&"*"A,.="&8*+4"B58*+#"A,.=C6"D-%*"5>"#"10#,%.2#2&"2&"-&@0,2*-"2&-2&"E"2&";#,&.'*"2&"EFGH"I-J&'*"4*'#6

!"#$,-.//$0#

!"+$#--& !"#$ @#,4*0"0/"/5%*2* -.//$0# 10&"2&9&"-&'"0-#2*"+*/"-0<-%.%0%*"2* !"#$,#)1"2>"8*.-"$&9#"&/"+*,%#"*30-*K4*'L'.*"+#-*"* -)0+&3,#&'$*4)0$ %&,4#"-.2*"+*,3.@0'#2*>"'&%*',#,2*"0/ %&'$,4)0$,#)1"26"M#-*",)*"%&,4#-.2*"+*,3.@0'#2*"&$&"'&%*',#'L"0/ !"#$,#)1"26

56789:;%*:<=>%?

N*.-",*9*-"/5%*2*-"3*'#/"#2.+.*,#2*-"#* -"-@$*A#)/$? +/"3'$0#*$B&A#? & $B&A#?6

O0<P"*,"O#.$-"Q6E"K"R"10&"4L"2&",*9*S

TQ

Page 33: Livro Ruby on Rails 2.1

!"#$%&'& !"#$%&'()&*+,(- ()*"+,)%)#+-%+"&"./+"01&#+%+2"3+14(45)"6+"/#"5)57+'"(1)8#+-%2"4-(&1#)'&")%1)3$6"'+"/#)57)3+"+,46%+9":;645)#+-%+"6/<6%4%/4-'&"&"()#&6&=

!"#$%&!#'(")*+,#*-./)012

!"#$%&'& &*+,(- (&4")'454&-)'&")& .#./&),(0"&2"+-./)-%&"./+"& !"#$%&'()&*+,(- $"/#"7+>0+1"0)1)"./+"3&5?"3)40&'+1"/6)1"-&"6+/"5&-%1&>>+19

1234514672-

@#)")>%+1)AB&"64#0>+62"#)6"4-%+1+66)-%+9"C%$")8&1)"&"D)4>6"%+#"/6)'&"#/4%&")"648>)"@EF2"#)6"./)-'&"6+"+,+5/%)"&#$%&'& (0), '&"&<G+%& 2+%&80'& +>+"#&6%1)1;"HIE"+"-B&"@EF9"J6%&"6+"';"0&1./+")"648>)"HIE"$"#)46"()#4>4)1"0)1)"&/6/;14&"(4-)>9

K+"3&5?"&>7)1"-&"0)4-+>"'+"5&-%1&>+"'&"L4-'&M62"&-'+"3&5?"+65&>7+"&"(/6&N7&1;14&2"3+1;"./+")"648>)"/6)')"$"HIE9"H&&8>++"O)7&&"%)#<$#"/6)#"HIE"+#"6+/6"01&'/%&69

30("45)"67859:5;7</*5%9 !"#$%&'()*+,-++.$(/01/2%

9:5;4<:3=><

!"#$%&'& ?,0')&,.#@& (/-54&-)"5&#&"& /(%A)&,.#@&9"P"#/4%&"Q%4>"0)1)"./+#"01+546)"+,4<41"6%14-86 9:5; +#"/#)0;84-) B27C2"5&#&"-&"5)6&"'+"/#)"'&5/#+-%)AB&2"0&1"+,+#0>&9

,=*9 >95)%"9:#,"+?09@#@A@B@C@#@D@EB2?.! "#$30$4$56++,7$+$56++89$4$56++,:$;+<

F)0R%/>&"S="C5%43+K/00&1%

SS

Page 34: Livro Ruby on Rails 2.1

!"#$%#&'()*#(+&,+"-&(&"."/0( ! 1(&2345

!"# $ %&'()*+,-*.$)*+ "/

6*&7,8+*-&7,*&.()(&(&9:)8;( "#$% +*<"&=*+9"'")(=&'(-&'")->(?&819/,@"&"&+*;,81.*&/810"&1(&+*,&"-7,8A( !"#$%&"'!"()%*5

01-23'45&&*(-,')16&'.7-89.'+-2-2').2+.$)*+ # -(5'

&'&()*)+'(#,$-'.*/$-*.*)'0,*.$123'#

B&819/,+>(&)(&45676849):;4<= 1( *6=;>4#?@@AB=CC)7684 C"98/8.(,&#,8.(&"+&9(8+"+?&#"+&."#$%#&-*#(A*,&"C/*D8$8/8)")*?&1>(&)*8D"1)(&'*-+(1"/8E"-&#"8+&1")"&"/%#&)(&FG&)(&+*-A8)(-&)(54567684DH

"A<7=87<.E4;FF 9-8(,&,#&'".90?&7,*&C(8&819/,@)(&1(&3"8/+?&819/,81)(&('IJ*+&*D.-"+?&9(#(&*+."+5

01-23'45&&*(-::;617',9**<5&.)-*(' :8'8.1617'.)-*('= >9*1697*)->

01-23'45&&*(-::;617',9**<5&.)-*(' :8'8.1617'.)-*('= >9*1697*)->= ?@AB,@CD,@,@?=:+68')&61' #/ ?E**?

(,

1*+E2F,61-2*+.1*+-(*99'(,E(6F8'+-.1617'.)-*(' # :8'8.1617'.)-*('= ?9*1697*)-?=G:1*8&('))2*+ #/ -(5'= :H'I5F #/ -(5'= :+68')&61' #/?E**?J

3,$K&(1&3"8/+&LHM&N&O&7,*&0P&)*&1(A(Q

RS

Page 35: Livro Ruby on Rails 2.1

!"#$%&'(($)!

!"#"$%&'"("$)*+*$*$,-*../ !*+,0$1$+/'"+2"$("$%&'"(" -.//,01 (/)/2(/$(" -203*4%1*+,5620,3$./$/-/$4"5/.)/,545,*("$*2'/.3$"$%&'"("$+/'"+2*+6$7% !*+,%620,%0273$,*."$,"2'+6+5"$./+6$7% !*+,%0270

! "#$%&"$'"#(%)%'(%#("#*"'+,-.&,/%01"'%!"#$%&'(($)*

1.$%&'"(". 8*0-, / 942 '*%8&%$'5#/+*%$./7.$+/'"+2".$*-'/+*(".3$(/#"-#/2("$7% !*+,:*1;<20, ,*."$"-203*4%1*+,5620, '5#/+$.5("$/.)/,545,*("0

9.'"$'"+2*$"$%&'"(" !*+,%-.//,01 "$2"#"$%&'"("$)*(+:"$)*+*$./$+/,7)/+*+$*$;"+*$*'7*-3$.78.'5'752("$" !*+,%027<=7/$,"2'527*$/>5.'52("3$%*.$2:"$-/#*$/%$,"2'*$"$47."?;"+6+5"$/.)/,545,*("@0

1.$%&'"(". =91,1*+,58,>,-13 8,>,-15=91,1*+, / 8,>,-151*+, '*%8&%$4"+*%$*'7*-5A*(".$)*+*$'/+/%$./7.$#*-"+/.(/4*7-'$,"%" !*+,%-.//,010

($#?@$)A?B$CDEF?CB$#BG(E)&?B&?#B?B#H!?A?BCI'"CJ

B"5.$2"#".$%&'"(".$4"+*%$*,+/.,/2'*(".$*"$"8C/'" C1/*043$" 8K.*8; /$" 8K.*8;L0

D.'/.$%&'"(".$4*A/%$"$%/.%"$=7/$"$%&'"(" 81/*M3$+/%"#/2("$/.)*E".$/%$8+*2,"$("$525,5"$/$45%$("$'/>'"3$%*.$*-&%(5.."$'*%8&%$*++7%*%$,*.".$"2(/$2"$%/5"$("$'/>'"$'/%".$%*5.$(/$7%$/.)*E"$(/5>*2("$,"%$*)/2*.$7%0

F/C*$7%$/>/%)-"G

+ ,# *$-*.////&0$".////1$/////$2345.2////+%2*("3!23#45/####&%6&"####*7%,"####(%#####%8)9:"8;

H*)I'7-"$JG$K,'5#/L7))"+'

JM

Page 36: Livro Ruby on Rails 2.1

! "# $%&$'(((()*%+'((((,%(((((%-./0'-((((!1-23+-*!"#$%&'$()*(+$,-).+$/)$)0123+04

!"#$%&'%!()*+%,-.%/%0%1"2%34%52%'&6&7

89

Page 37: Livro Ruby on Rails 2.1

!"#$%&'()*

+,%-./0/1(&2,/

!"#$%&'()(*+,-$(".",/0"$0/010"1("/02(0/(3%+"-(*2+3*4'(5"2(50"&/25(/(3%067+"1+"501+"$5&(3%("1("*&*%(/0*")89:;,5<#%-0'.*"1+"#$%&'()(*+,-$("."2+**='(5"$+3*,/&-"*(-'&6+*")89:;,5"0%-0'.*"1+",*+"1("+>?(%+*"@,(";,3$&+30/"$+/+",/2-+AB"20-0"*(-'&6+*"-(/+%+*<

34+567)89:+;<)!7:7)57:8)68)343=0;7>

#5C,3*"*(-'&6+*",*0/"+"(D/0&5"$+/+"3+/("1+",*,4-&+E"+"@,("3+*"+>-&C0-&0"0",*0-",/0"F)G"/0&*"+,"/(3+*"0**&/H

!""#$%%&'(&)"*+,-.&(&/0(&1*(2"-*(+3*.$#2))0"'23"-)+3*.

I0*"&*%+"C(-0'0",/"2-+>5(/0E"2+-@,("%(/+*"1+&*"0--+>0*"JKL"("+"&3%(-2-(%01+-"*("2(-1("20-0"(3%(31(-"&*%+<"M+-"(*%(/+%&'+"0";+-/0"1(",*0-"+ +,%-./0/1(&2,/ ;+&"(*%(31&10",/"2+,$+E"0;&/"1(";0$&5&%0-"+",*+"1("(/0&5*"30"0,%(3%&$067+<#C+-0"'+$N"%0/>./"2+1(";0O(-"0**&/H

P02=%,5+"QH"#$%&'()(*+,-$(

RS

Page 38: Livro Ruby on Rails 2.1

!"#$$ %&'$() ! "#$%&'(')*+,#'--./)'$&"*+$,-& . /0--1233-'#!-,$+!(4/$&"*+5$&' . /&')&$-(+6,4&)&78)&9()#-,()+!(4/$&"*+1#$$:('; . /1#$$/

&);

!"#$%!&!"'(!)*

!"#$%&'#()$)*#+&,-#.%$&/*&$)+#/$,)&)01+2).2)&(%&+)"/1.2)&3#$*%4

'<#) . %&'$()+*,);=>?)(-@'<#) . '<#)+!"()&)(-@'<#)+)&:A 0 123$,+'

56&7%-)&2#*%$&.#2%&8/)&%&,6'1%&.9#&,-#.%&.).:/*&%2$1;/2#&(%&,-%++)<&%').%+&#+&%2$1;/2#+&(#&$)+#/$,)=

'<#) . %&'$()+*,);=>?'<#)+#;;'&$$ . B-'&&-C;;'&$$+*,);=>D 21&'$()@,; .EF'<#)+,;?'<#)+0#$0 . G2)(- .E /#)FCH&$F,)$-#)!&/I

)(-@'<#) . '<#)+!"()&)(-@'<#)+)&:A 0 123$,+')(-@'<#)+#;;'&$$ 0 1234*5'$6*78,,*,)(-@'<#)+0#$0 0 1239-:*$3123;/:3"(')3%:)$/:#';<

>/;?&#.&>%1-+&@=A&B&C&8/)&:D&()&.#7#E

FG

Page 39: Livro Ruby on Rails 2.1

!"#$%&!'

!"#$%&'(")(*+,-$(",*."/001"2.-.".$(**.-"#13*")4506,7"("2+-"&*%+"(*%8"*,*$(%9'(7"."2-+:7(;.*"<("7(=%&<>+"+,"*(-'&<+-(*6+-."<+".-?"4;".7@,=*"$.*+*A"*,.*"$B.;.<.*".+"#$%&'()(*+,-$("2+<(;"(C2&-.-"D%&;(+,%E?"#@+-."'+$F"2+<("$+=%-+7.-"+%(;2+"<("(C2&-.G>+"$+;"."2-+2-&(<.<("%&;(+,%?

!"#$$ %&'$() ! "#$%&'(')*+,#'--./)'$&"*+$,-& . /0--1233#1,+1&(1"&+!(4256663/$&"*+-,4&(7- . 8 0 ')1',/232)'4+56*)2/5$')26'2'71%,/,

&)9

H(*%("(C(;27+"6+&"$+=6&@,-.<+"+"%(;2+"<("%&;(+,%"2.-."I"*(@,=<+*?"J"-($+;(=<.<+"K,("(*%("'.7+-"*(L.":.&C+A"2.-.2(-;&%&-"K,("*(,"*&*%(;."6.7B("-82&<+"D+,"6.&7M6.*%EA"&;2(<&=<+"6.7B.*"(;"$.*$.%."K,("2+<(-&.;"&=$.2.$&%.-"+"*(,"*(-'&<+-?

3=%(-=.;(=%("+"#$%&'(")(*+,-$("*(":.*(&."=.":&:7&+%($."H(%NN/001"2.-."6.O(-"-(K,(*%*"/001?"P,.=<+"'+$F"<(6&=(",;'.7+-"2.-."."2-+2-&(<.<("%&;(+,%A"+";(*;+"'.7+-"Q"<(6&=&<+"2.-."+"-(.<R%&;(+,%"<."&=*%S=$&."<+"+:L(%+"H(%NN/001"K,((*%8"*(=<+",*.<+?

!"'.7+-"2.<->+"Q"<("TU"*(@,=<+*?

V.29%,7+"WN"#$%&'()(*+,-$(

XY

Page 40: Livro Ruby on Rails 2.1

!"#$%&'()*

+,%-(./",0

!"#$%&&'(&)")*+,-"').-&/)01&%234")(&)5-6728-9234")(&)767:%-";)+"#")<=>?;)@>?;)A252B+%-$,;)&',%&)"7,%"6C)&)")*+,-"'!"',%"88&%)0+"',%"8&)(&)D87E")(&)'&1F+-"CG)0/-H-$&(-2C

12345674

89:-.-.;()&<):&=(>?(@A@-()#";@B(

I#2)'"52)"$34")D"-)2+%&6+&',2(2)2")#J,"(" %-<9CD(.9C=9'9,%;)21"%2)5"+K)$"(&)-'(-+2%)7#)528"%)$2(%4")$2%2)"6+26"6)&#)L7&)")6&7)767:%-")2-'(2)'4"),&'M2)6&8&+-"'2(")'&'M7# 1-<95(.9;)"7)L72'(")2)+"87'2)'")N2'+")(&)(2("6)D"%'782G)O2%2)-6,")D"-)+%-2(2)2)"$34" E;9:"&'%;)&',4")5"+K)$"(&%:)762%)")#J,"(")(26)6&17-',&6)#2'&-%26P

!"#$%&'($%)$*$+!,-.)$/-0 -!"#$%&'($-0 ("*0 1"(+*.2$%3*4(5 67 !/.$8

Q7NR)"')Q2-86)SGT)U)V)L7&)M:)(&)'"5"W

XY

Page 41: Livro Ruby on Rails 2.1

!"#$%&'($%)$*$+!,-.)$/-0 -!"#$%&'($-0 ("*012$34.*! 56 -74+"3"+89"#$8,:;8<8=4(424>- >

!"#$%&'($%)$*$+!, -.)$/-0 ?!"#$%&'($?0 9"#$@'($A.)%&'($)012$34.*! 56 -74+"3"+89"#$8,:;8<8=4(424>->

!"#$%&#"#$"'()$*#&+"#$&$",-." !"#$%&'( ()/)$&,&0)%)0$%"+$" )*+#,-.# 1'2"0+&("$34$#)5)%1"'&("6

/0+1(-"-0$-2+%((#"3-$$4#(

7$+89"(" $-2+%((#"3-$$4#( 2"1$1'%5*:("$'&#$%5&##)# )*+# ) 5%(#)*+# ,&0&$0)9"0'&0$'"$2"0+&9" 677!88 "()#/1"$(&$;"0&$<=>6$?"0$)@)+,5"A$)+$'"##"$2*#"B;"0401"$C;"0&$()$D0&#:51&E$"$()#/1"$0)9"0'&("$,)5"$+89"("$#)01&$*+&#901'F$%"+$"$/&5"0 9:;<!;;!6

G&+"#$&"#$)@)+,5"#H

I)%*,)0&'("$"$()#/1"$&$,&0910$()$*+$J&9)=1+)H

24!$!"#$ 5 B4!$9"#$A+"C"*,DEEE0 F0 F0 E0 E0 E0 G4!"'(4*,HI0 DJ>>24!$!"#$A3'/#4!!$2%'33)$! ! "#$%&'()''!24!$!"#$A3'/#4!!$2%'33)$!,34*)$> ! "#$%&'(''!

KF"0&$&$,&0910$()$*+$=1+)H

9"#$A*'+4*,DEEE>A3'/#4!!$2%'33)$! ! "#$%&'()''!9"#$A*'+4*,DEEE>A3'/#4!!$2%'33)$!,34*)$> ! "#$%&'(''!

!"9)$L*)$)#9)$+89"("$0)9"0'&$*+& 4(2*.=A$L*)$,"()$#)0$2"0+&9&(&$"*$'."$(),)'()'("$("$/&5"0$,&##&("$%"+",&0M+)90"6

>&,:9*5"$NH$K%91"'?&%O

PQ

Page 42: Livro Ruby on Rails 2.1

!"#$%&'&"()%*+,-.+%/

!"#$%&'& ()%*+,-.+%/ ()*#+%)"*),-+.,*"%)/%)/"0&#"12/&/34&*5*+&/"'+1)*)6%)/"')"2#"2#,"1&*#,"7)#"/+#(-)/8

!"# $"%$&'()*'&(##%"$+,$-&"./&$0 12345*%$"6.1 !(*%%"6$&"78*' 9*$,(.*':;<= >?@= A*$"B,C"D'()*'&(##%"$

".!+,$-&"./&$0 1234E".$6*'1 !(*%%"6$&"78*' 9*$,(.*':;F= >?@= A*$"B,C"D'()*'&(##%"$

".!".!

9/%)"4)-()*")*,"(,*,"/)"04,#,* ()%*+%)#,/&-,:"#,/"1&+"*)6&#),'&"(,*, ()%*+,-.+%/ (,*,");+%,*"2#,"0&612/<&"0&#&"12/&34&*5*+&"+61&*#,'&";+, 012345647 ) 5)#,8/&-,=

5)#,8/&-,+9,:,%;

9//)"#$%&'&"1&+"*)#&;+'&"(&>2)"6<&")/%,;,"#,+/"/)6'&"2/,'&=

5)#,<)-+=>99,-%+%)#,+/&-,

9//)"#$%&'&"1&+"#&'+1+0,'&"(,*,"*)%&*6,* :,?@ >2,6'& 5)#,8/&-, 1&*"62-&=

5)#,<=*A-B,+%)#,+/&-,+%&+=>99,-%

9//)"#$%&'&"1&+"#&'+1+0,'&"(,*,"*)%&*6,* :,?@ >2,6'& 5)#,8/&-, 1&*"62-&=

?27@"&6"?,+-/"A=B"3"!">2)"45"')"6&;&C

DA

Page 43: Livro Ruby on Rails 2.1

!"#$%&'$('&)

!"#$%!&! !"#$%&'$('&) '!(")*%+,)&!"-),)",+%!,.),"/# *+,"-$./00&1,22!"#$3",4%&'$ ,+-,+0+.%).&!")"1!,)2!,,+.%+".!"'/0!"1!,3,(!"2!.'(4/,)&!".! !"#$56&'$5"67+#-*!8

!"#$%&'($ ) *+,-,""* ! "#$%&'('))%!"#$%&'($%('- ! "#$*+,-$./$0'1$.223$.24.54.6$&78$9:2422

7&#081$9)",49+&$1+"&'

9!("2,()&!"!"#$%!&! +&#081$9)",49+&$1+"&' :2!#"/#")*()0"-),)";<=>".)0"2*)00+0 !"#$ + :8,$!"#$?"%!,.).&!-!00@A+*",+)*(B),"/#)"2!#-),)CD!"2,!.!*E4(2)"+.%,+")0"2*)00+0 !"#$? :8,$!"#$ +"(.0%F.2()0"&!*+,"-$./00&1,22!"#$3",4%&'$5"G),)"+.%+.&+,"#+*1!,"2!#!"'/.2(!.)?"A+H)"!0"+7+#-*!0")I)(7!":!",+0/*%)&!"&+2)&)"*(.1)"+0%3".!"2!#+.%3,(!"*!4!"&+-!(0"&!"2E&(4!>8

!"#$%./0123334 5)6 !"#$%./0178889 729 :79 2:9 ;89 ;89 8884 ! :!"#$%./0123334 5)6 !"#$%./0123339 79 79 39 39 34 ! 2!"#$%./0123334 5)6 !"#$%./0123339 79 79 39 39 39 33744 ! 9:

!"#$%./0123334 5)6 <,/$!"#$%0"=">178889 729 :79 2:9 ;89 ;84 ! :!"#$%./0123334 5)6 <,/$!"#$%0"=">123339 79 79 39 39 34 ! 2!"#$%./0123334 5)6 <,/$!"#$%0"=">123339 79 79 39 39 744 ! 9:

!"#$%./0123334 5)6 ?0/"[email protected]'B/CC!"#$D"/EF'($%($-1!"#$%./0178889 729 :79 2:9 ;89 ;84G4!"#$%./0123334 5)6 ?0/"[email protected]'B/CC!"#$D"/EF'($%($-1!"#$%./0123339 79 79 39 39 34G4!"#$%./0123334 5)6 ?0/"[email protected]'B/CC!"#$D"/EF'($%($-1!"#$%./0123339 79 79 39 39 74G44

J)-@%/*!"K8"L2%(!.G)2M

NO

Page 44: Livro Ruby on Rails 2.1

!"#$%"&'()*$+,$&-$$*.

!"#$#%&'()*"$"$+,-"*"$./-0//%1$%2$&'233/$4#+/5#-67"%/$8292$:/9#;#&29$3/$2$#%3-<%&#2$/3-=$/%-9/$*(23$*2-23>$?@/+8'"A

!"#$%&'"#''()*+,-'%."/*011120324023425125162+,-'%."/*3777202027272066

!"#$()*$+/012$

?3-/$+,-"*"$&9#2$(+2$%":2$#%3-<%&#2$*/ 34&"5$67//)1&88!"#$%"&'()*$ B$829-#9$(+2$3-9#%C>$?@/+8'"3A

+,-'%$8(' 9 :;<#<,,:! "#$%&'('))%+,-'%$8('%=<>?'*@0111A03A40B0CD77D77@6! "#$*+),$-.$/01$.222$.3455455$&67$8.5455

+,-'%$8('%(8#! "#$*+),$-.$/01$.222$.3455455$&67$8.5455+,-'%$8('%=<>?'*@33D47D77@6! "#$*+),$-.$/01$.222$994-5455$&67$8.5455

!"#$()*$+0&

?33/$+,-"*"$3/9:/$8292$&9#29$(+2$%":2$#%3-<%&#2$*/ 34&"5$67//)1&88!"#$%"&'()*$ B$829-#9$*"$%D+/9"$*/3/C(%*"3$*/3*/$"$E%#@$/8"&6>$?@/+8'"A

+,-'%$8(' 9 :;<#<,,: ! "#$%&'('))%+,-'%."/*37776%"8EF ! "#$23::;3;55<5

F(.G$"%$F2#'3$H>I$J$K$L(/$6=$*/$%":"1

MM

Page 45: Livro Ruby on Rails 2.1

!"#$%&'($%)*+,-../-/00%01! "#$%&'($)*$+,-$*...$*/011011$234$5*1011

!"#$%&'()*)$

!"#$%&'('" ()+") ()+,) ()+#) -((.*"(/) 0,12322) ()+4"&5) ()+*"(/(#&/ * /657 +',-$#-(./.'0-('"#0-#/1-""*2.$*3.&45'0*6#7-,-#$-.',*"#.0+',$-89*"#"':,*#*""*"#$%&'('"#;*,.+.<=*#0-#('/=$*0&-8>'#(' 8"#5$

9#&/:#(-;)</%$/%.0/."0"<*)%."0"%)%8=>4%?@A

?'#@=:A#B6C#&*,*$'"#-1D=0"#$%&'('"#0';'"#0-#/1-""* 9#&/)#$%&'('"#/'$'E

!"#$%('2! "#$467$89:$1)$*;0<;0=<$>?4$=11<

!"#$%('2%34(5)67! "#$@ABC,

FG."&*#=$#H-,-#/-(-#(.-#(-#"*$-0-6

!=&,-#/=,.'".(-(*#%#<=*#'#$%&'(' ()+$ ('#':I*&' 9#&/ &-$:%$#;-.#&*,#=$#,*&',0'#=$#H'=/'#(.+*,*0&*6#J'I*#<=-0('*G*/=&-$'" 9#&/@</B@()+$)#&*$'"#'#"*D=.&*E

!"#$%($2%*'83! "#$D467$E-F$*=$*10).0=G$H1=11$=11I!

?'#@=:A#B6C#&*,*$'"E

K-HL&=1'#ME#N/&.'07-/O

PM

Page 46: Livro Ruby on Rails 2.1

!"#$%&$'%()*+! "#$%&''()*')*&$*'+,-+&.$/'&''!

!"#$%"&'()"(%*"+,"-%."/)*"01&2'"3456"7$8)9":,"#$%")"01&2'":,"%'(,"'%;8)"<.%<1.18)"<1.1"2&81."/)*"%'(1'"12(%.1=>%'4"?"/21''%!"#$%"&'()*$9"<)."%@%*<2)9"1/1A)$"8%".%/%A%."$*1"&*<2%*%;(1=B)"<1.1"C$;/&);1."/)*")'"*D()8)'"8)"<.&*%&.)%@%*<2)4

+,!-./012

E1.1"#$%*";B)"/);+%/%9")"*D()8) 34&)56"*7 .%/%A%"$*"(%@()"#$12#$%."/)*)"<1.F*%(.)"%"'%")"(%@()"(&-%."12G$*%;8%.%=)"8%"%*1&2")$"8%"$*"'&(%"%2%".%().;1")"*%'*)"(%@()"/)*"+H<%.2&;I'4

E)."%@%*<2)J

,-()*."&/0123$++$4$+($4$&5$6$7)849((:8;;'''%6-<=)&6,".+%3)#1>! "#$012332$2342$25627289+$:44;+<<===>7?@A957BCD3>19E

?/);(%/%"#$%"12G$;'"'&(%'"/)*)")"?*1K);"%'(B)"$'1;8)"(1*AD*")"'&;12"8%"LML"N&G$12O"%*"'$1'"P0Q'9"%"%'(%"*D()8)";B).%/);+%/%"%'(%"'&;124"R%:1"/)*)")"*D()8)"'%"/)*<).(1";%'(%"/1')J

,-()*."&/019((:8;;'''%,#,?)&%3)#;!$+("&@;6$AB:5*<<+*+6*C1>! "#$:44;+<<===>BEBF95>19E<G234C5H<72I

S)(%"#$%")"*D()8)"(%.*&;)$")"+H<%.2&;I"%@1(1*%;(%"1;(%'"8)"'&;12"8%"LML9"<)&'"%2%";B)"'$<).(1"%'(%"'&;124"T$%."8&K%.9;B)"'$<).(1-14"S%'(1";)-1"-%.'B)"8)"01&2'":,"(%*)'"%'(%"<.)A2%*1".%')2-&8)4

!"*%'*)"*D()8)"C)&"12(%.18)"*1&'"(1.8%"<1.1"(1*AD*"<%.*&(&.")"$')"8%"P0Q'"/)*")"'&;12"8%"<1.U;(%'%'4

0$AH");"01&2'"345"V"!"#$%"+,"8%";)-)6

WX

Page 47: Livro Ruby on Rails 2.1

!"#$%$"&'(#)$#!*+#,("#&-./01$2$23

!""#$%%&'()*+*#&,*-(./0%)*+*%1#/*"&234.5#6"&/20/-#!*478

!"#$%&'

4(#,.5-.#6"#0(7(#8(."6'9.5(#62-0)( ()*++,-. $'$#2$.9#,.5-)(#,("#(#2$:6501$#,;)5:(3

9: ;./52;./3<#.7"8 ,. =;= :>9#>9:? ;(@-A&@ $"*"@& :>9A/B%>9:? ;("&C"2;*&@, $"*"@& :>

9%#>9#>9:? ;(@-A&@ $A.,D :>9A/B%>9:? ;("&C"2-/&- $A.,D :>

9%#>9#>9:? ;(76A5*" EF#,-"&E :>

9%#>9: &', :>

<$21-#8(."-#8-=#"651(#"-52#2$015)(>#?#"@1()( -*/0- 8(5#50,'6A)(>#B21$#"@1()(#.$1(.0-#6"- !"#$%& ,("#(#1A16'(#)-#,('60-)$01.(#)$#6"-#1-:#CDE+ 1-*/0-2>

>> ;(@-A&@ $"*"@&?> 9@-A&@ ;./?E#.7"2"*"@&E>G*"@&9%@-A&@>

>> ;(@-A&@ $"*"@&H EIB7!./"B"*"@&E?> 9@-A&@ ;./?E#.7"2"*"@&E>I 7!./"B"*"@&9%@-A&@>

F-&A16'(#G3#4,15(0H-,I

JK

Page 48: Livro Ruby on Rails 2.1

!! "#$%" &'('"%) *+,-./0','('"%*) &1"#-- 2! *'('"%3"#$%"*2! 4"#$%" 5/02*6/-'3'('"%* 1"#--2*'('"%3"#$%"*!+ -./0','('"%47"#$%"!

!"#$"%"&'(')*#+,"-#( !"# ."/-#('.*'-*01'2'3)(4-5-6-7"3'8'('/(,"'.*'$*69*'."'-"9-(':&"'$(/-8,'('-;-&7('.('/(44(')(4-<'=-*0 $%&'(%) 8'/*'>"#.*."'&,'#?-&7('*44($6*.('*('(%@"-( *"+,-,.,%(<'A&*/.('4"'$76$*'/('#?-&7('B"7"'/C('8'&,'76/DE'($(/-#(7"'*44($6*.('F'"7"'#"$"%"'('G($(<

H(%%I'H&44"77'"4$#">"&'&,'*#-60('6/-"#"44*/-"'",'4"&'%7(0'4(%#"'"4-"'*44&/-(<'J($K')(."'7KL7('/('"/."#"M(NO--)NPPQQQ<#(%%I(/#*674<$(,P*#-6$7"4PRSSTPURPSRP-O*-L$O"$D%(9L/"".4L*L7*%"7

V*,%8,'G(6'6/$7&;.('(',8-(.( %&'(%-,&/ /( 0"#12&/3(%*(#<'W4-"',8-(.('G&/$6(/*'"9*-*,"/-"'$(,('('7*%"7',*4."'&,*'G(#,*',*64'46,)764-*N

!! "#$%"3'#8 9:/;%92! 4"#$%" 5/02*:/;%*!</;%47"#$%"!

!! "#$%"3'#8 9:/;%9) 9=%>,:/;%92! 4"#$%" 5/02*:/;%*!=%> <#;%47"#$%"!

!! "#$%"3'#8 9:/;%9) :(") &1"#-- 2! 9-;#""3"#$%"92! 4"#$%" 5/02*:/;%* 1"#--2*-;#""3"#$%"*!</;%47"#$%"!

2',8-(.('-*,%8,'*$"6-*'*'()MC( 4!"#X'>"@*'&,'"9",)7(N

"#$%"?&6/-') &'('"%) :(") &5/0 2! *;@35/0*A

Y4-('>*6'#"-(#/*#'*70('*446,N

4"#$%" 5/02*;@35/0*!B('"%47"#$%"!

H&%I'(/'H*674'R<U'L'2':&"'OZ'."'/(>(1

[\

Page 49: Livro Ruby on Rails 2.1

!"#$%&'#$(&)"#$*+$!,#)$-#)./#0,

!"#$%&'()$%*$+&,"%*$%-./.*0$"0(&.*)$%-.%/$1)2,+./%.&%3,("/%4%$%'/$%-. 12345267 5,+,%.0(),+%,%+.5.)(67$%-.%89-(#$:;.<,&$/%'&%.=.&5"$%-.%/.'%'/$>

!" #$%&'#$% ()*+%, ()%- ./0)*+%*'1234 5$ "/!".0%+65+%0(12%372-0./ 8#$%&8 "/!".0*)9&73'32:08;%+23+80"/

!" +65 "/

-234526 4%'&%1+,#&.*)$%-.%89-(#$%?'&%).&5",).@:%!%0,*),#.&%-.%/.%'/,+%'&, 1234526 4%.0(),+%,%+.5.)(67$%-./*.8.//A+(,-.%89-(#$:%B,+,%'/,+%'&, 1234526 4%&'()$%/(&5"./C%0$8D%5$-.%8$&.6,+%8$&%,"#$%&,(/%$'%&.*$/%,//(&> 389:83$;1234526<=$>92?8>:%E.5$(/%-.0.%8+(,+%'&%,+F'(0$%8$&%$%&./&$%*$&.%-, 1234526C%&,/%8$&%'&%'*-.+/8$+.%*,%1+.*).C%/9%(//$:

G%89-(#$%,8(&,%4%,%1$+&,%8$&$%./),&$/%,8$/)'&,-$/%,%1,H.+%I$<.C%&,/%*./),%*$0,%0.+/7$%-$%3,("/C%1,+.&$/%,%&./&,8$(/,%-.%'&,%1$+&,%'&%5$'8$%-(1.+.*).C%,//(&>

!" #$%&'#$%<=)*+%> 5$ ?#? "/!".0%+65+%0(12%372-0./ # "/!".0*)9&73'32:08;%+23+80"/

!" +65 "/

J./).%.=.&5"$%*9/%0,&$/%+.*-.+(H,+%,%5,+)(,"%K'/.+/LM1$+&KC%F'.%+.8.N.+A%'&,%0,+(A0."%8I,&,-,%1$+&%8$&%,/%+.1.+D*8(,/8+(,-,/%5."$ (@3?AB56:83:

!%1$+&,%,*)(#,%),&N4&%0,(%8$*)(*',+%1'*8($*,*-$:

O,5P)'"$%Q>%!8)($*B,8R

ST

Page 50: Livro Ruby on Rails 2.1

!"#"$%!&'($)&*($%!"%&+"'%,((-

!"#$%&%'"'()*"+" ./0123445,'-.%')'/(0'#"12+0+%'#"'302.4'5678'9/%':0&2.2*"/'(/2*"'0'&;20<="'+%':%%+4'>*"(6'?%@0'/(%A%(B."'+%'/4"C

-('/('0;9/21" !"#$%&'()*&+,!-#$.C

!"#$%&''( (# )&''()&''(*"+",'-./#$'0(#01#2#.3&''(*45(!"'(--65#7"7*&+87"*98'!"'(%!"33

&#8 5#7" +: 65#7"7&''(*':"8;-5#7"3 (# )':"8;)':"8;*"+",'-5#7"*"+",'3':"8;*9#:"':"-5#7"*<#(;= >";5' ?@ AB"$,A3

':"8;*!4"B#8 (# )!4"B#8)!4"B#8*:!$'-.C!8,#70D8!:(#.3

':(':(

':(':(

D'9/%')'/('0*"(':%%+,'>*"(')'"'#"(%'+%'/('%4*2."'E04%0+"'%('FGH'%'(%*0'+0*06'-('"/*;04'B0.01;04')'/('B;"*"&"."9/%;'4%;1%'B0;0'B/E.2&0;'&"#*%I+"'#0'2#*%;#%*'9/%')'4%(B;%'0*/0.2J0+"8'&"("'/('E."K8'B";'%A%(B."6'D4':%%+4'4%(B;%'4="B/E.2&0+"4'%('FGH'%'#"'&04"'+"'>*"('L%%+'%.%')'2+%#*2:2&0+"'&"("'0BB.2&0*2"#M0*"(NA(.'(%+20'*OB%6

P04'B;2(%2;04'1%;4Q%4'+"'302.4'567'%4*%'()*"+"'0&%2*010'&"("'B0;R(%*;"4'04'"B<Q%4 67.89:.948 6;00/2:;7 % 6:;78'1"&SB"+%'"E*%;'(024'2#:";(0<Q%4'4"E;%'%4*%4'()*"+"4'#0'+"&/(%#*0<="'+"'302.46'G04'&"('0'0.*%;0<="';%0.2J0+08'0K";0B"+%("4'2#&./2;'#"1"4'#0(%4B0&%4'0"'%.%(%#*"';""*'+"':%%+6'T";'%A%(B."8'4%':2J%;("4'0442(C

3/EO'"#'302.4'56U'V'D'9/%'$W'+%'#"1",

X7

Page 51: Livro Ruby on Rails 2.1

!"#$%&''()*+$,-./!00* 12 *3""0/445556576#894:;;<4!00*= (# >&''(>

!"#$%#&'%()%*$+,&'-

?&''(@+$,/,!-91A'-BCDA +$,-.1A3""0/445556576#894:;;E4F"#$A+$,-./!001A3""0/445556576#894:;;<4!00A2

./)0&)(/'$'$#1#20"'$)(&#%+'%3$0'/#%4)2',$5,*6"'$),,+2-

!"#$%&''()G*+$,-./!00* 12 *3""0/445556576#894:;;<4!00*H*+$,-./#0'-D'!8I3* 12 *3""0/44!J6I#$4B4.0'I4#0'-.'!8I34K6K4*L= (# >&''(>

&''(6"M",')AN#$'@(#@O#9#A=&''(6P0(!"'())Q0#.".6&M8."6I8'!"'(%!"==&''(6"!9R)#0'-D'!8I3/"#"!,S'.P,".H K;=

&#8 0#." M- Q0#.".&''(6'-"8T)0#."= (# >'-"8T>'-"8T6"M",')0#."6"M",'='-"8T6I#-"'-")0#."6U#(TH /"T0' 12 *3"$,*='-"8T6"!9R)*!00/'(M"'(*H VM$'6-#5=

'-"8T6!P"3#8 (# >!P"3#8>!P"3#86-!$')AW!8,#.@X8!-(#A=

'-('-(

'-('-(

7)04&5"'$8-$.9&+'(:)9;

8<

Page 52: Livro Ruby on Rails 2.1

!"!#$

!"#"$%"$%&'("#"$ %&'()*+,-.'./*-0*1 )*"+)%+,("+-)&%."+%.)#+/"%"%-)&,$.)0,%123,451%0"&"%.+,637"8

!"#"$%"$%0)093-*%$("+,$%6"+)&%+,(3+)#"$%#, ".,23+!3+,&344*&55!'./2+(556&'()*+,755 !"#$%&#"!'()%"!*!"#$%&'())*+#,,-."/&,,8%:,$(,%0)$"%$,%2"0;%6)<%+,6,+;-03)%)%=&%$("+,>%0"&"".,23+!3+,&344*&55!'./2+(556&'()*+,7558*)3&19,3&*>%."+%,7,&.?">%$,+@%-,0,$$@+3"%)?(,+)+%$=)%+,6,+;-03).)+) ".,2:*9;<<3&,55!'./*558*)3&19,3&*8

".,23+!3+,&344*&55='7*>%&'()*+,-.'./*-7,3&* #,37)%#,%,73$(3+%,%#@%?=*)+%A".,23+!3+,&344*&55='7*>.'./*-7,3&*8

B"3%3-0?=C#"%-" ".,2:*?*.3&@55='7* "%&'("#" .'./*-0*1 .)+)%6)03?3()+%"%)+&)<,-)&,-("%,&%0)09,%#,%D0(32,E,0"+#$%.,?)$%-"2)$%F3F?3"(,0)$ ".,2:*9;<<3&,55!'./*55G8%H$(,%&'("#"%6=-03"-)%)$$3&I

!! "#$%&'()*+,)'-'.+/0+12! 34#$%&'(56*+,3

!! "#$%&'()78*%9:;)'-'.+/0+12! 34#$%&'(56:3

!! "+#5$*)78*%9:;)'-'.+/0+12! 34+$4<+6:=>??@A>>BA:????3

B"3%3-0?=C#"%" ".,2:*9;<<3&,55AB2<>@*.3)<&*77C.3)<&*77 .)+)%6)03?3()+%"%4+)..,+%.)+)%" D42E8

D*"+)%2"0;%."#,%=$)+%,-(+,%)$%".JK,$%#,%,-23+"-&,-(%" .3+%2(>.'./*-7,3&* .)+)%3-6"+&)+%"%?"0)?%.)#+/"%#,)+&)<,-)&,-("%#"%0)09,8%L)?,%?,&F+)+%M=,%$,%"%#3+,(N+3" ,)<C.'./* ,73$(3+%"%.)#+/"%'%" 624*9,3&*>%0)$"%0"-(+@+3"%"8*)3&19,3&* '%=$)#"8%L"0;%."#,%0"-63*=+)+%#)$%$,*=3-(,$%6"+&)$I

E=FO%"-%E)3?$%P8Q%R%S%M=,%9@%#,%-"2"T

UP

Page 53: Livro Ruby on Rails 2.1

!"#$%&'!(!)*+,-".* / 01*1".2+,-".*!"#$%&'!(!)*+,-".* / 0$%3*+,-".*4 567(-)6-"6!(!)*68%.*!-".25!"#$%&'!(!)*+,-".* / 08.9+,-".*4 58.:920663"!(3)",-0;<;=5!"#$%&'!(!)*+,-".* / 01*1+!(!)*+,-".*4 53"!(3)",-5!"#$%&'!(!)*+,-".* / >2?@#A-".*'#*@B57(.(1*-*.5C

!"#"$%"&'(')"#$"*$&+'*"*,$%+'$'-&(./0+$+$&+12-)3#'+$"4"'5+$-+$"#6.'7+ !"#$%&"'!"()*+%&,-.($&"/%0,$"%'1$02$(214#38(+$02*)"+9:;+<

! "#$%&%'())$*$+,%-&-.$%#,/*$%(+%0*/'1-,(/+! -/+)(23-&-.$4#,/*$%5%67$74-&-.$4#,/*$

!"#$%!&'()*(+,!-!./()'0)-1-2#()0,)3-+$&43

=5'*)'"$.1$4.>$"+$*2$.)'('?"#$+$1@)+0+ 356789:575;<7=< 21$.1"$*)#'->$6.2$&+-)'-A"$B*<$C$4.>$#2)+#-"7"$+$B*$1"'D*&.(+<E2F"$.1$25219(+G

DD 59.(#8"E,F93"&5'-%-3*%G*/D 5H.(#8"EAFH3"&5

E2F"$&+1+$%'&+.$+$12*1+$25219(+$*H$6.2$">+#"$&+1$"$&+##2:;+$02**2$4.><

DD 59.(#8"E,F93"&5'-%-3*%G*/D 5H.(#8"E,FH3"&5

I"9/).(+$JG$K&)'+-!"&L

JM

Page 54: Livro Ruby on Rails 2.1

!"#$%&'&!()

!"#$%&'%$%&(%)*$&+,%-&%./0#1&2#0&.3%4%5%&5,$%1/*&%&*6*.,78#&5*&(,%&90*:&20.#,&4%0(&2;.0-<&)%(/%&,(%$&#&4=/#5#*+,-./'/*01>

!"# $%&'()*)$+, "-

?&$*/#$1#&(*$;&#&4*(4#&+,*&'*"%$&# 2*3*0456*+,-./7<&4%(&5*&,4%&2#$4%&4%0(&*-*"%1/*@

"!"8)9'!"#$%&:!")$#!:"%&;$"$%&!$9

?&4=/#5# +*+<14'*+,-./ %"#$%&/%4)=4&%.*0/%&%&#'78# 6-=<&'*$40/015#&#&,(#&5*&.#150.0#1%0(&'%$%&*('*.020.%$&+,%15#,4% *+,-./ '#5*&0$&'%$%&# +*+<1@&A#$&*6*4'-#>

%$%.,/*$%&'() 0')1,23 0'4 #- 56(%7),8 9:;%; <%76,=>,/&74(6+$&7?/()@ A

B#&*6*4'-#&%.04%<&% *+,-./:-/>1? (C&0$;&'%$%&# +*+<1 (*&18#&2#0&%.*((%5%&90%&,4&$*+,*(/&DE?B@

"%&;$"$%&!@:&%:(A#%;%:"!"8)9'B!C)

?&4=/#5# +*+<14'2*D1 "%13#,&,4%&#'78#&'%$%&.#150.0#1%$&(*,&,(#&F6-=G@&H*I%&,4&*6*4'-#>

! "#$%&'&()&*%$%.,/*B$C, 0')1,2

! +#',&-*.'/01'2#34'5#67').&$'&'#589#':-"%$%.,/*B$C, 0')1,23 0'4 #- 56(%7),8 9:;%; <%76,=>,/&74(6+$&7?/()@ A

J,)K&#1&J%0-(&L@M&N&?&+,*&3;&5*&1#9#O

PQ

Page 55: Livro Ruby on Rails 2.1

!"#$%&'()*#+(,#*!-'./('#*01*20$20$

!"#$%&"&'(%)"#*+,"%(%'(*#-(%.,+%'("/(%01/2,3%4%.+,*5#$(%6%)"#%0"+(&2#%,/%2#/2#/%7,'8%&"&'(%.,01(%',&91+$(+%/#%"$($#&/(:#$%9,1%(+$(;#&(0(%&,%95(/<=%.,+)"#%#5(%#+(%51$.(%.#5,%>(15/%(&2#/%0#%'(1+%&,%/#"%/'+1.2%0#%2#/2#?

@,%>(15/%A?B%#/2#%.+,*5#$(%9,1%+#/,5710,?%C:,+(%7,'8%.,0#%1&'5"1+%51&<(/%',$,%#/2(%#$%/#"/%2#/2#/D

!""#$%&#'(!) *+,!)(#&-./0*123)!"45*%#"%&-./*6

#.0$$#'3(*%0"40,$*!(,#*3#$*5/0)$

!"(&2(/%7#;#/%7,'8%&E,%'+1,"%"$ 67897: #%0#.,1/%)"1/%"/FG5,%0#&2+,%0,%$#" ;<=>:<887:3%H(+(%',&/#:"1+%1/2,%/I1&'5"1&0,%,%$I0"5,%0, 67897: &, ;<=>:<887:=%$(/%1/2,%/#$.+#%0#1J(%/#"%'I01:,%',$%(.(+8&'1(%0#%/"K,?

H(+(%,%>(15/%A?B%9,1%'+1(0,%"$%.+,JL%.(+(%('#//(+%,/%<#5.#+/%0#%9,+(%0(/%71#M/?%N"&'1,&(%0#%$(&#1+(%$"12,%/1$.5#/D

! "#$#%#&'((#$%)%*+,)-)%(.*/0'12)$*#,3%/)$%'4'*/0)788)9:!%9.-;.-%$.))#$<4#)8#$"<"9=8)#&3.$=!%>%#?%@

O1$.5#/%#%51$.,P

?$('

>(15/%(:,+(%('#12(%H4OQ/%0#%',&2#R0,%SO4@?%H,+%#J#$.5,=%7,'8%.,0#%#&71(+%"$(%+#)"1/1-E,%H4OQ%(//1$D

ABCD E8."%"FG8."%GH2FG%9%)#GH GI$#!J9-K2L#/"GMM

T(.U2"5,%VD%C'21,&H('W

VV

Page 56: Livro Ruby on Rails 2.1

!"#"$%&#"'()"*(+("&,-$+#"&("'(+).',/ !"#"$%0"12$#"(3%)"4%-5)#-(6"*#+",7,8*/#9

!"# $%"&'"()*+' , -*+'.$%"&'" )&%&/+01)*+'2! "

"3!

:(+("3%,8"-;#"2(<,"#"=>?@"A"%8"B5#-5#++,-$,B"&#"CDE6","A"8%)$#"%2(&#"*(+("$+.4,F#"&,"&(&#2",8"=('(>5+)*$6"*#+3%,"A+,*+,2,-$(&#"-,2$("/)-F%(F,80"G(H"#"2,%"-#8,9 &"'"()#*!+,-./0)+,12+"+*230

4567,1589(

?2"/,)$#+,2"&#"8,%"</#F"IJ$$*9KKLLL0-#8,&#M#F#05#8N"&,',8"5#-J,5,+"#"8,%"*/%F)- :;%+2$,<0%2;#)0,1"$00O5J#"3%,",/,"*#&,",2$(+"5#8"2,%2"&)(2"5#-$(&#2000"9I

@#"P()/2"'#5Q"M."*#&)(")-5/%)+"("#*R;# ="% -("2%(2"+#$(2"I5#)2("3%,"4)S"3%,2$;#"&,")8*/,8,-$(+")F%(/"-#"8,%"*/%F)-6"*(+(8(-$,+"("5#8*($)<)/)&(&,N6"(F#+("'#5Q"$(8<A8"$,+."("#*R;# =!"+>?3"$0% *(+("(/$,+(+"#2"-#8,2"&(2 ")+*23%0

/&).%"+*4%$" 1+$5**6+7 1&+ ,8 9"+$*6&+97 1)&'5:3&/"+ ,8;< 13"= ,8 93*>&9 ?

T/(+#"3%,"8,%"*/%F)-"()-&("5#-$)-%("2,-&#"U$)/"*(+("%2%.+)#2"&,"',+2V,2"(-$,+)#+,2"&#"P()/20

@9AB1B1@-,5,C-:5CBD5EF-,@9,(9G,5<HGBI-,@9,<-65(

@#"P()/2"W0X"'#5Q"*#&,"&,4)-)+",8"3%,"(+3%)'#",2$;#"2%(2"+#$(2")-5/%)-&#"("2,F%)-$,"/)-J("-#"2,%"(+3%)'# !"#$%&"'!"()%*9

$*3#@A.%*4'"+:$*3#@A4%&'@*3:#@6"

P%<Y"#-"P()/2"W0X"Z"?"3%,"J."&,"-#'#[

\]

Page 57: Livro Ruby on Rails 2.1

!"#$%&$'(%"()%*#+,%(-%.-%/(01)+$%$0'(%2$/3%#(-%'$+"%4)$0#5(0'"%"(&6)6'$"%7.(%."6-%$"%-("-$"%-8'.,$"9%:+:,+$#(/6"%(&,.;+0"<

=$)%(>(-&,$9%;(#"6#+"46/#+$0</$-%(%6&+<;(#"6#+"46/#+$0</$-%/$-&6)#+,?6-%$"%-("-$"%-$'(,$"9%-6"%0@$%$"%/$0#)$,,()"9?(,&()"%(%2+(A"<%;(#"6#+"46/#+$0</$-%#(-%$%"(.%6)7.+2$%'(%)$#6"%/$-%$#+-+B6CD("%&6)6%-(,?$)6)%$%"(.%EFG9%(07.60#$%$6)7.+2$%'(%)$#6"%'6%H=!%0@$%&)(/+"6)+6%'(%06'6%'+"#$<

!"!!#$%&'$%(

I6,2(B%2$/3%0@$%"6+:6%-6"%0$%J6+,"%K%&$""L2(,%'(",+;6)%$%."$%'(%"(""D("%6""+-M

!"#$$ %&&"'!#(')*+)*(,)""-, ! "#$%&'(&'$)&**+),,-./+$-$$')* .)//

-*0

N(O6%7.(%0$%(>(-&,$%6/+-6%("#$.%'(",+;60'$%6%"(""@$%&6)6%#$'$"%$"%/$0#)$,,()"%P)**+,-./,01201/30++43Q9%-6"%(.#6-:K-%&$'()+6%46B()%+"#$%&6)6%6&(06"%.-%/$0#)$,,()%("&(/L4+/$<

R6"%(%"(%(.%7.+"()%7.(%.-%/$0#)$,,()%S,+;.(S%$%."$%'(%"(""D("%&6)6%(,(T%U$%J6+,"%V<W%$%-K#$'$%6/(+#6%6%$&C@$ '019%6""+-M

!"#$$ 1$-,$+)*(,)""-, ! "00*%#.$%&'(&'$)&**+)$-$$')* .)*

-*0

X6&L#.,$%YM%H/#+$0=6/Z

Y[

Page 58: Livro Ruby on Rails 2.1

!"#!$%&'()"*+",#(&"(-',.$(#/.+*"#

!"#$%&'(#$")'*&$%+#*#$,-$(-.$/#0-.$1#($2-.(3-($#1*-.'&.-($,&$4#'5($-.#$*-(*#. 01231456$7)$"-("&$89$(&/.'$)"$:&%#,&$;#.#<#.#1*'.$=>>?$,-$%&:-.*).#@$%.'#1,&$*-(*-($;#.#$#5<)1( 01231456

A(*&$/'%&)$")'*&$('";5-($1&$4#'5($B6=$%&"$#$1&2#$%5#((- $6789:;81<==!157>?516$C#"&($;-<#.$&$%D,'<&$#:#'E&$%&"&-E-";5&F

!"#$%& '&"(%&)&%(&*#&+ ,-,%&.!"#!/0"1,&1,2,34.56789,&:,/

&1#

#&+ 6"!&(34&2(3,6(&"(%&2(3,6

&1#&1#

C-8#$%&"&$/#.-"&($;#.#$*-(*#.$'(*&$1&$4#'5($B6=F

0%3;; '&"(%&)&%(&*<&;, $ %&!'()*'"+,,-".!/0."#&+ ;&,$(=0,-"1>"1,*"%%&*55?"$,-1455?"$,&;@#*3A #" B!3(B!3(@(&"(%& C(&"(%&C8 50"1,*"%%&* DE C(&"(%&C8 530,-"1 DE C-1#&:C!3(@0"11&0, C50"1,*"%%&*F530,-"1F5-#C

&1#&1#

#&+ ,&;,2,-,%&3;;&*,2&G$3% HI67E?$JK9"19?3-%;IF67EH8 ,-,%&.H?$JK9"19?3-%;H/

&1#

4):G$&1$4#'5($B6=$H$I$J)-$+9$,-$1&2&K

LM

Page 59: Livro Ruby on Rails 2.1

!"# $"%$&'()"*+,"&*+$'+%%"-$&"./+0 12*"(*0"134'()"*+,"&*+$'

"5!"5!

!"#$%&'()*+),-%.(/0"-1

*2

Page 60: Livro Ruby on Rails 2.1

!"#$%&'()*

+,%-(.!(.%/(''0/

!"#$%&'()'(%*'++,*"-"."$./.0."*,12'(134,+"2'*"*,$,5,*".1"*,67&1&89,1":,5","0,"%'/.*".1"0,$&19,1"0'"67;"1,*3,<,$7%.0'","*,(0,*&=.0'"'7"0,"*,0&*,$&'(.*"2.*."'7%*.".8>'?"@/.".8>'"-"0,A&(&0'"$'/'"/-%'0'1"2B5+&$'1"('1$'(%*'+.0'*,1"67,"1>'".7%'/.%&$./,(%,"0&12'(C4,&1".%*.4-1"0.1"*'%.1?

+!1234!34153667588539124:

;"#</((%

#D'*."(."E'*."0,"&(A'*/.*"'="#</((% 4'$;"2'0,"1,*"7/"2'7$'"/.&1 >5? 71.(0'"7/".+&.1"2.*."&1%'?

F.1"4,*19,1".(%,*&'*,1"0'"G.&+1"4'$;"A.=&.".11&/H

G75I"'("G.&+1"J?K"L"!"67,"E3"0,"('4'M

NO

Page 61: Livro Ruby on Rails 2.1

!"#$%&'()&))*+% ,-+%./+00&/ 12 3)&))*+%)34 ,"-.*+% 12 3%&'3!"#$/++. ,-+%./+00&/ 12 3)&))*+%)34 ,"-.*+% 12 3%&'3

!"#$%&'#()&*#+,&-%.,$&%//012

!"#$%&'()&))*+% ,-+%./+00&/ 12 3)&))*+%)34 ,"-.*+% 12 3%&'3!"#$/++. ,%&'()&))*+%

!"#$%&"#'("%)$*+"*,$)-.

!&%340"%&01*5,1,34%67#&+#&$,(#38,(01,34#&+,&$#4%/&*,$(#$$0%&4#+%/&%/&$#4%/9&:1%;%;:1%9&,&0/4#&(#3/:10%&1:04#&4,1*#<=1%&3#'%&01*5,1,34%67#&1%0/&034,50",34,&-#0&+,/,3'#5'0+%&#3+,&/,&($0%&:1%&>$'#$,&+,&$#4%/&,&#&$,(#38,(01,34#&?&-,04#*,5#&*$,-0@#9&*:5%3+#&$#4%/&/,1,58%34,/<&A/4#&B>&+0103:0&,1&%*$#@01%+%1,34,&C<D&',.,/&#&4,1*#&+,&$,(#38,(01,34#<

E#+%&%&3#'%&01*5,1,34%67#&,/4>&3#&%$F:0'# ,"#$/%')'$%0$1)'('.-)'$%2,3 ,&#/&+,4%58,/&+,&/,:&-:3(0#3%1,34#&,/47#G,1&,@*50(%+#/&3#/&(#1,34>$0#/<&H%$%&1%0/&03-#$1%6I,/&/#G$,&0/4#&',B%&%&+#(:1,34%67#&3#&*$J*$0#&(J+0"#&-#34,<

4..",)0,$5)'%/

!"#$%&?&*#//K',5&4,/4%$&:1%&$#4%&(#1&:1&1?4#+#&LEEH<&M,B%&#&,@,1*5#2

"))&/.(/+5.*%678 ,!&.9+: 12 3#5.34,#".9 12 3;#/+:5-.;<=>3 ?4

8 ,-+%./+00&/ 12 @#/+:5-.@4,"-.*+% 12 @5#:".&@4,*: 12 @<=>@ ?A

N%*K4:5#&O2&!(40#3N#34$#55,$

OP

Page 62: Livro Ruby on Rails 2.1

!"#$%&'()%*&'

!"#$%&'()*'(+,-.(/'"(*"(0%/'(/,1,('"(2,3/*$*.0('()*'3(1'%4#3(0*#0(3,/#0(&,("'0",(%1%,"#5(6"(,*/3#0(2#7#+3#0(#,(%&+801'(/'3(#7$,(-,",9

!""#$%%&&&'()*+,")'-.('/0%#0.1*-"+%2345%0)6,)&+

:,-.($,0/#3%#(1'(/'3(#7$,(#00%"9

!""#$%%&&&'()*+,")'-.('/0%#0.1*".+%2345%-.()7"80,.+

!0/,(;<('3#(2,00=+'7>("#0(&?,(1'(*"#(@,3"#("*%/,(0%"27'0>(&?,(2'7,("'&,0(0'"(-,"23,"'/'3(#7$*"#0(-,&+'&AB'0(1,C#%705

D$,3#($#&E#3'",0(#(,2A?, +"' &,,"#$%&'()%*&' 2#3#(2'30,&#7%F#3(&,00#0(3,/#05(:';#(*"('4'"27,>(2#3#(-,&0'$*%3(#GCH(#-%"#(/,/#7"'&/'('"(2,3/*$*.09

(8#'0)+.*0-)+ $#0.1*-"+9 $8+ :; <#0.1*".+< 1. =#0.1*-"=! "#$%&'()#*+,*-.)"/(01"#$%&'(2344! 56"#$%&($.6789:6'$;*<(/#,$.=#0.1*-"'0)+.*0-)+ $#0.1*-">0)6,)&+9 $8+ :; <-.()7"80,.+<

)71

-./012.12/314453++.-.6027++8955:027

I#0(+'30B'0(#&/'3%,3'0>()*#&1,(=#",0(1'-7#3#3(*" ';&&#&% /=&E#",0(1'(%&@,3"#3(#(-7#00'(*0#&1,(0="J,7,0>(#00%"9

-?8++ @,+"+A.7"0.??)0 > ?""@,'/(,$<A$<(#$@@*#-8-!)+>8-",.7 $,71)B9 $+!.&9 $#*/?,-9 $C))1

C*JK(,&(C#%70(L5M(N(O()*'(E<(1'(&,+,P

QL

Page 63: Livro Ruby on Rails 2.1

!"!#$%&'$$($) *+,&-%&'$$($).*/0+1 2345 *$6,-. *6$&-)/1. *&#")$ 7

$06

!"#$%&'&(#))*+,-&.,/-%$%$&,0(-1/12%3,42,&53%&/-%)),&%#&14+')&.,&5)%$&53&)*36#-#7&8)2#&'&4,/,))9$1#&),&#&),5 !"##$#%,)21+,$&,3&53&3:.5-#;&(#$&,0,3(-#7&<36#$%&+#/=&(#))%&/#42145%$&5)%4.#&)*36#-#)&(%$%&#)&.,3%1)&/%)#);&%&(%$21$&.,%"#$%&+#/=&2%36'3&(#.,&>%?,$&%))13@

!+"&& 8,&-&9/0-)/++$) ! "##$%&'(%)*+)*(,)$$-,!"!#$&%"!-,/0 *,06$:. *&#/'. *(;<+,!. *=$$6!"!#$%&'$$($) >($0?")**@'$$($).

*/0+1 2345 *$6,-. *6$&-)/1. *&#")$ 7$06

A%(*25-#&B@&!/21#4A#42$#--,$

BC

Page 64: Livro Ruby on Rails 2.1

!"#$%&'()*

+,%-(./-01

!"#$%&'()&*+","-"$-.-/-"0*12'(134*5"2*5-"6*0-78'"/-"&(%*09-$*"4&1:4*5"-'";1;30&'"-%0-4,1"/-"$'(4*018'"/'1"%*.25-%*1"<=>?

+!2345/3678896:;6<=88>4<?96:;6<

@-0'ABC@(D)@(DEC@(D),(E)")(#FG()-.A0HI

!1".,%'/'1 J@-0'ABC@(D * @(DEC@(D 0*$*@*0-."-"'278' 8-.A0HA"0*.'4*(/'"-"(*$*11&/-/*"/*";1-0"' 8-.A0H)KL).-'*."$-/-"'@B*%'"/'"9'0.;530&'?")*B-"'1"*C*.25'1D

!"$E/&6'"9&$-4-"-11&.D

!" #$%&'()#*+ ,-+*.%/0102(3)200+$450%(616,7802(3 '* 9#9 ":!";8#<0%=0)#$%&'8>?2@%78>$?'%=8;: ?$& ":

=;@F"'("=-&51"G?H"I"!"J;*"K3"/*"('4'L

MN

Page 65: Livro Ruby on Rails 2.1

!"#$%&'())*+,%(*-)$.()/$.(+)*0$#1 +(- "1!"#$%&'())*+,%(*-)$.2'34-),)*25637/$.(+)*0$#1 +(- "1

!"$*+)$"1

!"#$%&'()%&%**(+,

!" %(*-)2,%36 8963:*;5<5=2>,=556(?45*2@<@8/$5=2>/.(+)*0 #1 +(- )3 A%A "1

!"#$%&5*05,%(*-)$.+=B*$"1!"# %&'())*+,%(*-) .() "1!"#$%&'())*+,%(*-)$.2'34-),)*25637$"1

!" *+) "1

!"#$%&'$()**+(,-(./**0!#(+(,-(.

!"#$%&-#.#*&#*&+/-#.#*&.0**0&+1.23#&420&-$%-%+&.%-%*&5123456474836 39:456474836 6474835123439:46&0-)78&%)0(-%+9:;<&#=-(#>*7&?0@%&2+&0A0+=3#&2*%>.#&# 12345647483

!"# )=5*,2*-*;5 C(5*BC/C'=99*+(+DC/ .36)*6 #1$<.)=7@/ .;-=22 #1 C%33?=6C"1

12345;47<4=

B&+/-#.#&.%-0CD03=0$&'#(&%3-0$%.#&=%$%&2*%$&# 0234>8?==4@3 =%$%&.0-0$+(>%$&#&*02&E%3#$&=%.$F#7

G%=H-23#&I,&!)-(#>?(0J

KL

Page 66: Livro Ruby on Rails 2.1

!"#$%&'$()**+(,-(./**!//(##!0+(,-(.

12345621789:95;14<672=<9>54?>

!"#$%&'#()(%*$+,"#*-%.&%(.%&-,"%-*/.,0("%1-0-"2*,3#%3-*-%"$*$&%,425.6)("%/.-4)(%.&%"6&7(5(8%)$#$*&,4-)(%3(*%0(298%:(*3-""-)(%2(&(%3-*;&$#*(%3-*-%(%&'#()( 89:95;14<674>;@AB27693<%=%,)',-%'%/.$%$"#$%&'#()(%"$1-%2>-&-)(%4(%-*/.,0(4>46C1D )(%"$.%35.+,4%3-*-%*$+,"#*-*%("%-*/.,0("%1-0-"2*,3#%/.$%"$.%35.+,4%,4"#-5(.%4-%3-"#- <AD@4;E89:95;14<65<%?$1-2(&(%:.42,(4-@

! "#$%&'()*#$)+),-&.!"#$%&'$()**+(,-(./**!//(#012+(,-(.3.(2$/#(.45161/".$-#4(7-1&/$%&

*8%&9(: ;<=>?@(1A?B ?C%A:?B ?#1$,?D

! /01#)23$4%50+6#$%22)785161/".$-#4$&",EA(4#12 *8%&9(:

! 90&07#2$)2,#8F/".$-#=#:-(;?#(7#G5161/".$-#? /.";?G5161/".$-#/G@(1A35/?<FG/".$-#<F/".$-#=#:-(;?#(7#G5161/".$-#? /.";?G5161/".$-#/GC%A:35/?<FG/".$-#<F/".$-#=#:-(;?#(7#G5161/".$-#? /.";?G5161/".$-#/G#1$,35/?<FG/".$-#<

12345621756F@25G22672=<9>54?>

!"#$%&'#()(%:-A%$B-#-&$4#$%-%&$"&-%2(,"-%/.$%(%&'#()(!;64?>'42H**+2@<215**!5526#93+2@<21I12345621789:95;14<672=<9>54?>8%&-"%2*,-4)(%.&%"6&7(5(%3-*-%"$*."-)(%4-"%2>-&-)-"%-(%&'#()( 56F@25G2267@4>J7693<%?$1-%.&%$B$&35(@

! "#$%&'()*#$)+),-&.!"#$%&'$()**+(,-(./**!//(#012+(,-(.3.(2$/#(.4/#:,(/@((#4(7-1&/$%&

C.7D%(4%C-,5"%E<F%G%H%/.$%>I%)$%4(0(J

KK

Page 67: Livro Ruby on Rails 2.1

!"#$%&' ()*+,-&./,0 ,1#/',0 ,2.34,5

! "#$%&'()*+,#-.%)+''&/062'4&6-&&2743$%72.8 !"#$%&'

! 1#2#/%')&'3%0943$%*-:&;(,<62'4&6-&&26<-&./=>66, "&/3.(,6>:&&$, :&4(,62'4&6-&&2,

2'?&(,2&@2<>66, <)943$%*-:&;(,<62'4&6-&&26<1#/'=>66, "&/3.(,6>:&&$, :&4(,62'4&6-&&2,

2'?&(,2&@2<>66, <)943$%*-:&;(,<62'4&6-&&26<2.34=>66, "&/3.(,6>:&&$, :&4(,62'4&6-&&2,

2'?&(,2&@2<>66, <)

!"#$%&'$()**+(,-(./**0%.1#!2+(,-(.

34567898:;

!"#$%&#'#"(%&%$%$")*+" *<=>?7@6 (",$)%-%./0-",$&"$.10"&" A34567898:;2$3,,%$")*+"$45('#"(%$/6%0%./(0/$'"."$(".10"&" B7>C98=2$7/8%$5.$/6/.)9":

6A1"3272.8BCD.E&*>-.$8&6C0 !>#$;3:" () ,F:&*'#A*6A:&G,H

;%)<059"$=:$>'0#"(7#/?

@=

Page 68: Livro Ruby on Rails 2.1

!"#$%&'$()**+(,-(./**&012(.+(,-(.

3456789:;9<48873<=

!"#$%&'& 3456789:;9<48873<= ()**&+")"),-.%)/")"&(01& *>;85?: ,&#&"()/2#-%/&3"(-/#.%.4'&")"5&/#)%)01&"'&6)7&/"/-%&/4)'&"(-7&"#$%&'&8"9)*"6-/*:-*")4%-/.&/-*3"4)";&/)"'-"5&/#)%)/#&*"6)7&/-*"-#"/-).*"(/-,.*)#&*".4,7+./"+#-*()0&"4)"5/-4%-"')"&(01& *43@: ()/)"<+-"&"5&/#)%&"5.,)**-",&//-%&8"=->)"&*"-?-#(7&*@

!"#$%&'()'*"&&%!*+,-.--/ 01%23&3()& 45 6/6/ 07%89#9(%& 45 6.6/ 0"!9( 45 6:;6<! "#$%&'()((!

!"#$%&'()'*"&&%!*+,-.--/ 0=)&#3( 45 6>"?>!6/ 01%23&3()& 45 6/6/07%89#9(%& 45 6.6/ 0"!9( 45 6:;6<

! "#$%&'$()((!

A7$#"'.*%&3"(&'-#&*"(-/*&4)7.B)/"'-"&+%/)*"5&/#)*3"(&/"-?-#(7&@

!"#$%&'()'*"&&%!*+,-.--/ 0=)&#3( 45 6>!?%#?&%3916/ 01%23&3()& 45 6/6/07%89#9(%& 45 6.6/ 0"!9( 45 6:;6<

! "#$%()(($*+$,*-./%

A&"#&4%)/"*+)"(/C(/.)"*%/.4D"'-"5&/#)%)01&3"6&,E"(&'-"+*)/"&*"*-D+.4%-*"()/2#-%/&*@

>" @3&3 3?"!9737%?#)!%(A&93>! @3&3 )?!B#%&)

F+GH"&4"F).7*"I8J"K"!"<+-";L"'-"4&6&M

NO

Page 69: Livro Ruby on Rails 2.1

!"#$%&'$()**+(,-(./**#(0#+(,-(.

1231456

!"#$%&'& 1231456 $"(#")*+,*-",.-."+&/.+01.-"(#.",.+.2-."'*3%-&"'*"(#."4-.5*"*"-*%&-3.-"(#.".6-*20.78&"'*5%."4-.5*/&#"&"39#*-&"'*"/.-./%*-*5",.55.'&"/&#&",.-:#*%-&".3%*5"*"'*,&05"'.",.+.2-.;"./-*5/*3%.3'&;"<(.3'&"3*/*55=-0&;">?>@A*B."*5%*"*C*#,+&D

!"#!$%&'()*+,-+,-./-!".0%1!(2 (./(2 34! "#$%&'$('$)*$+,)-.&%

!",-&6+*#."$"<(*"*C05%0."(#"EFG@"H*"2&/I"/&3%.-"2*-="<(*"'*,&05".",.+.2-."*+*"%-&(C*"3."2*-'.'*"5*05"/.-./%*-*5"*"38&/03/&@"J55*"6(K"4&0"/&--0K0'&@"A*B."&"*C*#,+&"'&"4(3/0&3.#*3%&"/&--*%&"'*55*"#$%&'&D

!"#!$%&'()*+,-+,-./-!".0%1!(2 (./(2 34! "#$%&'$('$)*$+,)-&%

7895:1;<=49>6

!"#$%&'& 7895:1;<=49>6 6.50/.#*3%*"-*/*6*"/&#&",.-:#*%-&"(#"%*C%&"<(.+<(*-"*"&"4&-#.%."'*"(#."4&-#."50#,+*5*#"LMNO@"!"<(*"*+*"4.1"$",*K.-"&"%*C%&"*"5(65%0%(0-"(#."<(*6-."'*"+03)."PQ3R",*+."%.K">S"6-"TU>@"J"<(.3'&"%*#&5"'(.5<(*6-.5"'*"+03)."5*K(0'.5"PQ3Q3R"*+*"5*,.-."&"%*C%&"*3%-*",.-=K-.4&5;"(5.3'&"."%.K">S",U>@

V&"W.0+5"X@Y"*5%*"#$%&'&"-*/*6*"(#"3&2&",.-:#*%-&"&,/0&3.+@"Z+$#"'&"%*C%&",&'*-*#&5"%.#6$#"034&-#.-"<(.05.%-06(%&5"LMNO"K&5%.-[.#&5"<(*"."%.K">S",U>"%02*55*@"A.#&5".&5"*C*#,+&5D

,+0%1!567$0.&'89+-0:!;82 <#1.,, => (?!,#$+%&+7/(4! "#$%/.$01)''"23+'04(.5(6*2#7($-8+9/:.#%

\.,[%(+&"]D"Z/%0&3A0*^

_`

Page 70: Livro Ruby on Rails 2.1

!"#$%&'()%*"#+,-.#'/0*&1$2*"#"3&4*#$5&3"53/%$2*"#31#%*2$"#$"#%$6"#78#9:7#5&'$2$"#93;*#1<%*2*=

>)(?#*/#>$';"#@=A#B#!#C)3#DE#23#/*F*G

HI

Page 71: Livro Ruby on Rails 2.1

!"#$%&'()*

+",'%,-.

!/01234356

!"#$%&'&(#))*+,-&.#/01"2$%$&3#4%)&%)&",5)&/,.,))6$1%)&(%$%&#&02/.1#/%5,/3#&.#$$,3#&4,&25&($#7,3#&%3$%+')&4#&/#+#$,.2$)# 7(89,:4:-;8&9#&%$:21+# -8<,=(8;-8%4=> +#.;&(#4,&%41.1#/%$&:2%1)&",5)&),2&($#7,3#&4,(,/4,<&.#5#&/,)),,==,5(-#>

!"#$%&'&() *+,*

!"#$%&'&() *-./%!"0*1 23(/4%"# 56 78'97124":/!( 56 *-00.2;;!"<('=->0-(?:!@>40%$$'#(0*

!"#$%&'&() *A=4B4C*1 2?%+ 56 *A=4;4C*

?#4,&1/)3%-%$&3#4%)&%)&4,(,/4;/.1%)&4,&25%&)@&+,A&B%)3%&2)%$&#&.#5%/4#>

C%(*32-#&D>&E%1-31,)

FG

Page 72: Livro Ruby on Rails 2.1

! "#$%&'&(%)*)$()$(+,-$('.$%&*)$!"#$%&$'()*+(,"--

!"#$%#&%&'())*+,-&-.)/"0&12".)&3,#)&,)/4(&),56(&2)"6()&5(&'0(7,/(&,8,92/"56(:

! /.$%&(%)*)$()$(+,-$(*,0,#*,#%,$!"#$%&$'(

;&),&"-32#&6()&3,#)&/.+,0&2#&"012.+( !"#$%&#'#()!* ,&+(9<&12.),0&-,+"0&(&3,#&725/(&9(#&)2"&"'-.9"=4(>&0(6,:

! 1)0.&()(+,-(,$0,2.342&*)(0&5&(6,#*)57+,-$7#)-,8*)8+,-9:;:;:!"#$%&$'().+/"0# 1234+5'$6756&$'

;&(&3,#&),0?&9('."6(&'"0"&(&6.0,/@0.( +,'-.!&/,0%&/,01'"0,23)3)3A&B")(&+(9<&54(&,)',9.C.12,&(&5(#,&6(&3,#(&D".-)&.0?&9('."0&/(6()&()&3,#)&'"0"&(&6.0,/@0.( +,'-.!&/,0

456789)9:;<:;<=>?986@

E&0,920)(&6( A.'B#/)/,0 /"#$%#&,)/?&6.)'(5*+,-&'"0"&2)(&9(#&'-23.5)A

F/%&"&+,0)4(&GAH&(&"012.+( #'#()!* 6,&2#&'-23.5&),&'"0,9."&9(#&.)/(:

! .#.%;5<(*)(0'=+.#()0,#8.*8&=%>,#%.2&%.)#!$8.*!$ 9:"7*(9!$8.*!$ 95/$+*79;0,*5+<5+,!5--$!))="($>($+7 )*+0-.7$? @/$+A7;.,B$+,*0",*5+

I")&5(&D".-)&GAJ&(&"012.+( #'#()!* ),0.":

D2$K&(5&D".-)&GAJ&L&E&12,&M?&6,&5(+(N

OG

Page 73: Livro Ruby on Rails 2.1

!"#$%&'&() *+,-./"0(#%1*2 34%- 56 *"0(#%1*2 37(+8%"# 56 *9'9':*!"#$%&'&() *+,-./.;1%8*2 34%- 56 *.;1%8*2 37(+8%"# 56 *<'=':*

!"#$%&';$>(+?%#%>%;4%@( 1"A!>%"#B"#>+"44(+33C;8('8(#1 3%#!4,1(2 D0(#E1A,>F(#>%!;>%"#

(#1

!""#$%&'()*+,&-,./&0,+)0&)&1)023)&4)0)&#*"1)5)0&1,+,"&,"&62$"&*2.2""70#,"%&2"12"&62$"&2"1)08,&2*102&252"9

!"#$%&'()*

!&1)": +,-.%/0123 .,$4#5)&1,+)"&)"&2;12*"<2"&*)1#-)"&+,&62$"&'(2&3,0)$&#*"1)5)+)"&)10)-="&+,&62$">(*4).:9&!&"#*1);2&=>

+;G(H&()83-,%41 ! "#$#%&'(#)%#)%*+,)+;G(H&()83-,%41 IJK5).&() ! -)&'.%/01'$,#0('%#%*+,

45678#"4$7!"#8758(4(9(7:858$":6(*5:

?(-2&($)&42'(2*)&)5120)@8,&*)&$2*")62$&+2&#*#.#,&+,&A)#5"%&)6,0)&25)&$,"10)&1)$B=$&'()5&=&)&-20"8,&+,&A)#5"&'(2&2"17"2*+,&.)0026)+)>

L;%48 M'9 ;004%!;>%"#H8>;+>%#&H"#HF>>03NN<'<'<'<3=<<<

:7()$;<'&)(9=<7>?

C,#&#*.5(D+,&*,&A)#5"&,&)1)5E, :@12.;A0/21B=A@CD 4)0)&02.(420)0&,&.)$#*E,&+,&+#021F0#, EA0/21BE +,&40,G21,9

H)4D1(5,&I>&A)#51#2"

JK

Page 74: Livro Ruby on Rails 2.1

!"#$%&'()$#*+'",-

!"#$%&$'(()!*+!"#$%&!'',*+!"#$%&)-.+)+!"#$%&/"/0)

!"#$%&'(#)*+#%"#&,-.(#/0#1(%23"(#%(#4",(5%,50(6 !"#$%12)3"4$,1$'(()!7 !"#$%1!'',7 !"#$%1)-. 0!"#$%1/"/0)*#8(%203"(#"(#%5%'9"(6

! "#$%&'()*#+%,'%-..)"!"#$%&$.//01

! "#$%&'"--,!"#$%&1..,

! "#$%&')/0!"#$%&023

! "#$%&'1#12)!"#$%&*"*-0

!"#$%&.)!%#'-

!%(#-02(:0(#%,502&"20(#;%2%#/0(4"<2&27#/12%,50#%#0=041>?"#/"#(01#4@/&A"7#B1%'#.#%#-02(?"#/"#$%&'(#03#1("7#<%(5%-%#1(%26

!"#$%4456!789:447;!8:<

!"#$%&'(#)*+#&(("#31/"1#;%2%6

!"#$%&301%#.2

$1<C#",#$%&'(#)*+#D#E#B10#9F#/0#,"-"G

HI

Page 75: Livro Ruby on Rails 2.1

!"#$%&!'(%)!*+,-.$/'/!"*$'0+'1203(%

!"#$%&'#()*#+*%#,-.*%#/(,01-,*21+*+$%#+-#3*12%#456#7($#89-.*.$2)$,&$#.-0:#,(,0*#(%*9'5#;1<-#=&*2.$>?@#8-97($#8-+$#%$97($#$)#*2<()#0*%-#)(1&-#$%8$01/10-#%$A*#1,&$9$%%*,&$#-B&$9#-#,C)$9-#+*#.$9%D-#+-#82(<1,@#8-9#$E$)82-5

F*9*#&$%&*9#1%&-@#89$01%*)-%#091*9#()#,-.-#*97(1.-#0G*)*+- !"#$%&'() ,-#+19$&H91-#+-#82(<1,@#*2<-#)*1%#-(#)$,-%#*%%1)I

!"#$%&' (!&)%* +&!,-%./&*0%,' 12324-/*5&06#0%,' 78! -/*5&09:%;<"!)<"/&;*%=&/;%;6)">0,"&)';$##6'??@@@2,%8/-%A%>%25%8

;$8-1%#8-+$)-%#9$0(8$9*9#$%&*%#1,/-9)*JK$%#.1*#0H+1<-@#*%%1)I

6)">0, B C!0)*''D)">0,2,/@E-0&/#%&0%F-%F8/"F6)">0,G6)">0,2!=%"#HI!"#$%&IJ ! "#$%&'()*+$,('-.*/6)">0,2!=%"#HI"&)IJ ! "#$%01123445556-*78.*9*:*6;*7/

L$#*2<(M)#$,0-,&9*9#*2<()#(%-#8*9*#1%&-#$#7(1%$9#0-)8*9&12G*9#0-)1<-@#&*2.$>#$(#)(+$#+$#1+M1*#7(*,&-#N#%(*#9$*2,$0$%%1+*+$5

O*8"&(2-#PI#3*12&1$%

QR

Page 76: Livro Ruby on Rails 2.1

!"#$%&'()*

+",-)."/,/0)1'&234/)-)5673#%/

.8595

7"3'/:&#;"%-

!"#$%&'%"()"$*+%$"&+($",)-"./)"0)")1)2/&$%"$"&$%)3$ 7",-)7"3'/:<7--=-:-;2- &$4564"0)%7")1)2/&$(+"+ 7"3'/:&#;"%-8$&/$9'-$:(+"+0"$%./',+0"()"2+:3'*/%$;<+") !"#"$%&'()=

>"46();-);";(/)-?)@ABCDCDC@

>+'"3)'&$"/4$"$9&)%$;<+":+"$%./',+"($&$5$0)0=%$?)"./)"$:&)0"0@"2+:0'()%$,$"/4"5$:2+"()"($(+0"9+2$9"2+4+")0&$:(+")49+2$9A+0&"#$%$"2+:0'()%$%"&$4564"+"BC @ABCDCDC@="B0&+"3/:2'+:$"&$:&+"#$%$"$"&$%)3$ 67-"%- 2+4+"#$%$ ;7(#="D"$%./',+($&$5$0)0=%$?)"&$4564"3+'"%)3)'&+"#$%$"&+%:$%"+"2@('*+"4):+0"%)#)&'&',+=

E/5F"+:"E$'90"G=H"I"D"./)"A7"()":+,+J

KL

Page 77: Livro Ruby on Rails 2.1

!"#$%&'#(")*+),%&%'-%)%-.%/012/")(")3'2&-

!"#$%&$'%()*$+,-$./&$01%$2&**340)$5&.60)%1$&$'%()*$07$*08$21&90"&$20)%$401*/&:$*&70."0$20)%$104(*/&,$;&$'%()*$+,-:2&<0107&*$5&.60)%1$87$10)0%*0$0*2053=(5&$5&7$&$5&7%.<&$%>%(?&@

!"#$%!"&'()*!$$+$)$,-$ ./0/12/345657

456789:7

,';%)<2+%=>"#%-='&&

'0"&1.%$"&<&*$&*$"(70$A&.0*$B80$&$'%()*$105&.C050:$%6182%<&*$2&1$&==*0",$D&5E$"%7>#7$2&<0$=()"1%1$&$10"&1.&$8*%.<&$&2%1F70"1&$&25(&.%)$GHHIJK:$2&1$0?072)&@$GHHIJKLMN,

,';%)<2+%=>"#%-=*-

J?(>0$87%$)(*"%$5&7$"&<&*$&*$"(70$A&.0*$<&*$OI!,$!$&2P/&$GHHIJK$"%7>#7$4%)0$%B8(,

,';%)<2+%=>"#%-=&"/'&

'0"&1.%$&*$"(70$A&.0*$B80$&$'%()*$5&.C050$B80$0*"/&$.&$70*7&$&==*0"$<&$*08$*(*"07%$&201%5(&.%),

Q%23"8)&$R@$'%S0$K%*S*:$T)86(.*$0$I51(2"*

UU

Page 78: Livro Ruby on Rails 2.1

!"#$%&!

'()*+,

!"#$%&'($")#*+,-.,/01+'"+')-&//"&1$*&",2*%+-2"$"0)$"(&"$,34$"52.6627,$*-8",&*&"902"2/2"0)2"0%"):'"27,$*-;"<$+"&(+#+$'&($$")0,$*-2"&",/01+')"=$),2(&($)"2%"*2,$)+->*+$)"?@A;

-./0,10(2

B))2")#*+,-"C&D"&"%2)%&"#$+)&"902"$")#*+,-.#$')$/2"%&)",&*&"$"E&'#$"(2"(&($);"B%"$0-*&)",&/&:*&)"2/2"2'-*&"'$"#/+2'-2"(2/+'=&"(2"#$%&'($)"($"E&'#$"(2"(&($);

F'&/+)&'($"$"#>(+1$8"&,&*2'-2%2'-2"+)-$")>":&+"C0'#+$'&*",&*&"E&'#$)"(2"(&($)"%G)9/8",$)-1*2)9/8")9/+-2HIJ;"K0&'($"0%E&'#$"(+C2*2'-2"2)-+:2*"#$'C+10*&($"'$"&*90+:$"(&-&E&)2;G%/"2"2)-2"#$%&'($"C$*"272#0-&($8"&"%2')&12%"L'$-")0,,$*-2(C$*"-=+)"(&-&E&)2"-G,2L")2*M"27+E+(&"'$"-2*%+'&/;

%345$6!

52718'0-2781298'()*+,1

F1$*&8"90&/902*"12%"902",$))0&"0%"&*90+:$ 9:+(1;+,+<=9. '&")0&"M*:$*2"(2"(+*2->*+$",$(2")2*"+')-&/&($"(2'-*$"($(+*2->*+$ >2,-09 ($")20",*$N2-$"O&+/)"#$%$")2"C$))2"0% '()*+,;

O0EG"$'"O&+/)"P;Q"6"!"902"=M"(2"'$:$R

ST

Page 79: Livro Ruby on Rails 2.1

!"#$%&'()$)*#+&*"'),'-./(0$"

!"#$%%&'()"*$+,-./010"$ 1#0." #101"#0$*/010"#$0 -./(0$" (2"$/30$")/.10"4-,(0(+3("4$"4-0(350-$ 2)$%&*3-./(0$"61#(+1%"-+*)/-+4$"/21")-+71"4("*54-.$"+$"108/-'$ )$20*&$,)$+4*59

!"#$%&'()*&%#+(,-./ 0 12)%34()*&%#/25 267#8"94()*&%#/2:

:$0;2"+1"'(0%<$"=9>"4$"?1-)%6"71'-1"/2"@/."*$2"(%31"*$+,-./01A<$"8/("%("21+-,(%31'1"8/1+4$"$"#)/.-+"3-+71".(+(013$0%9:$0"*1/%1"4(%%("@/."$"?1-)%"%5"(+*$+301'1".(+(013$0%"(2"#)/.-+%"8/("(%3-'(%%(2"+$"4-0(350-$ 2)$%&*3-./(0$"9"B1'(0%<$"=9C"(%%("@/.",$-"*$00-.-4$9

D1#&3/)$"EF"?1G("H1%G%6":)/.-+%"("I*0-#3%

JE

Page 80: Livro Ruby on Rails 2.1

!"#$%&'()*+

,-(%(%.#/)/)01-2#%3"1&'(3&0

,456567,8

!"#$%&'"($''$"$")'$*"$"($*+%*",-"$./*$"$"0-*'1/"2343532",/"6*/+/+7(-3"8'+/"'-*0-"9/:/"):"(*-($*$+;*%/"($*$"$"0-*'1/"23<32,/"'9*%(+3$9)&/3)'3

#)=7"/>"#$%&'"?32"@"!"A)-"BC",-">/0/D

<5

Page 81: Livro Ruby on Rails 2.1

!"#$%&'()**

+&,-)*./

01234516

!"#$%&'%#()"*+'+",(-"()./$(01/-",+"2(%)-"*+%"+"2345"6789":/-:+"+-":/&+$/-",/.();/-"*+$(:"(&()%-(,+-"#($(",/%<($"+"2(%)-"+:(%-"'+:#(.=>/)"#+--=>/)"'+:"("&+>(">/$-?+",+"23457"@/.();/-"'+:+"()./$($",/ 78'9.9:8;%;< #($( 78'9.9:8;%< &?+"*+$(:,/%<(,+-",/"*+$(7

A(:4B:9"&+"2345"6789"+":C,3)+ =";9>? D4(-/EF7$4G"*+%"$/:+>%,+9"#+$"%-.+".+,(-"(-"$/*/$/&'%(-"("/)/"*+$(:"-34-.%.3=,(-#+$ 3@%8A96&##(B%CC=";9>?7

H(#=.3)+"66I"2345"678

J6

Page 82: Livro Ruby on Rails 2.1

!"#"$%&'(")"$%*+,+%+%-.+$$/%)+(/(0&/

!"#"$%"&'(#$"$)*%+"',-,.,/"/($0/1)23'4+,&56$)*%$"$)."77( (1238$'#97$%:'*/*7$&*;*7$<*#"%$"/,),*&"/*7$=$)."77()453(123>$?7$%:'*/*7$7@* 67588 67589 ( 6758:;<<=35>$A"%*7$;(#$1%$(B(%+.*$/($17*$/($)"/"$1%C

!! "#$% & '#$%()*%+,)-)./01123 03 043 413 443 403 5#$)67#./893 0:;;!"#$%&'($)*$+,-$)../$*.0**0*)$1.2..

!! "#$%+<$,!"#$%&'($)*$+,-$)../$*20**0*)$3....

!! '#$%()*%+,)-)./01123 03 043 413 443 403 5#$)67#./893 0:;;+<$,=!"#$4567,

!! '#$%()*%+,)-)./01123 03 043 413 443 403 1;+<$,=!"#$89:,

!! '#$%()*%+,)-)./01123 03 043 413 443 403 5#$)67#./893 0:;;+<$,>6??@%$!"#$1)*2..

D1-4$*&$D",.7$E>F$3$?$G1($HI$/($&*;*J

KE

Page 83: Livro Ruby on Rails 2.1

!"#$%&'()*+

,-.&/

01234,5216)789:;<

!"#$%&'#(#)&*&$+",&-.+).$&$"/01"$*.$23&4$" =&.>4?-.&/ +"3$).3).3$*"$5&#(36$78"4&$'&3)&$23&4$"$-9)"*" ?-.&//-=:*.3*.$;2.$,"<=$>?$).+%&$"$8.-$#+3)&(&*"6

@&/A)2("$BCD$E.'28

FG

Page 84: Livro Ruby on Rails 2.1

!"#$%&'()*+

,&-.)/)!(00/12/.

345!56738)!69:73;)76)<6;=>8?;@9

!"#$"%&'%(&)%"*%+,%&+"-%*%("./*%0,%0"0*+ <(.%-0/;@91%2%(&)%*/*--$"%3&".0*%+,%/-$"#"%&'"%'$)-"4$*.%5"-"%"0$/$*."-&'"%/*6&."%,'%&'"%4"(,6"%78%,9$+4,.4,:%#,7"%&'%,9,'56*;

<-3&$#*; !"#$%&'()*#++,-(!!-./0)1'"

!"#$$ %&&'($) ! "#$%&'('#)*+,,-%.*/$%)0&*+ $*"+,-.#&&/!("-01 23)*0$4 2!($)4 2&*!30#"4 2.5*!3$3(1 67 84

2$!#"* 67 9*1&

&*+ $*"+,&(:15*0(;*/!("-01 23)*0$4 2!($)

=&(>%*.%="$6+%?1@%A%2%3&,%B8%0,%.*#*C

DE

Page 85: Livro Ruby on Rails 2.1

!"#!"#

!"#$%&'$%$(#)*"(%+,-)./"%'*)%+"0'.)%+"* !"#$%&'&()*+,*- $ !'%./$*+,*01%23",)%4%5",)%/$%,"/),%" #.1$23!4&5#.6$ $%6)*"(%6$,%+"*"%7-+"'%."(()%#)8$0)%."%8).+"9

7(/84) 9:"$ ;(2&<&$#'

-/ -.#$3$, ."#%.'00

/$(+, +5),)+#$,%6),:-.3;<==>

?,-+$ .'*$,-+;=@<>

+"(# .'*$,-+

A$B)%)%+"0'.)%C+"(#C%&'$%)+)8)*"(%/$%+,-),1%D0)%4%'* )84$#&% +"*'*@%*)(%/$6$,-)%($,%'*)%+"0'.)%+"*"%)%C?,-+$C@%0"3")+-*)%/$0)@%*)-(%?,$+-()*$.#$%'* )84$#&%=->0?1%!"%E)-0(%<1F%$(#$%$,,"%.G"%$H-(#$%*)-(@%)%+"0'.)%($,I%+,-)/)%/)%7",*)+",,$#)1

;@;A*9BCAD

J"-%+",,-3-/"%'*%8'3%&'$%.G"%?$,*-#-)%/$#$,*-.),%"%*-*$%#:?$%)#,-8'-/"%)" #$E8$'6F<(#46 '()./"%'*%(K*8"0"1%23",)"%+L/-3"%)8)-H"%BI%?"/$%($,%'#-0-M)/"9

$!%&!'()*+$,-( . /012+"!-''!$(3!%&-4 /012+"!56$!%&!'()*+$,-(

N)?K#'0"%FO9%P'3(%$%N",,$QR$(

S=

Page 86: Livro Ruby on Rails 2.1

!"##$%&"'($')*+',"'!-.,+$/!"0*1,

!"#$%"&&#'#("$)*$+)'$,-#./,0/,$1)20("$.,$/,0/232$).2&$"$*4/"(" 234567/289:;5 %"* <5:99'=>'?@:7 ,*$)*2$%"5)021),$6"#$%&#2(2$).20(" <5:99'=>'A49B77$8"&$%2).2$(,./,$+)'$0,09)*2$25/,&2:;"$,&2$6,#/27

<)+=$"0$<2#5.$>7?$@$A$1),$9B$(,$0"3"C

DE

Page 87: Livro Ruby on Rails 2.1

!"#$%&'()*+

,-.(/0"1234)56787(-"74

9:;<=>=?@;AB=)@=)!:;BB)B,<=)B!:,9<,?>

!"#$%&'(#)*+#"#%,-.&/" !""#$%!&$'()*+ 0&1".#23(4%#5%63&,%7

!"#$$ %&&"'!#(')*+)*(,)""-, ! "#$%&'(&'$)&**+),,-./+.-"&-, /#""

&,)(-!(01,)201),3-,4-*5

!"43#%#18%5%2%#9%,%#"#5:4"2" #/(%38%C./(0C.(/D3/E*

;<#"./&.#0%'%,#23#=,"((#>&43#>1,&94&6?@#A(43#:#"#6"53#23#.5%#0%'8%#23#(3?.,%6B%#361"64,%2%#0%1&'53643#35#?,%623#9%,43#2"(C3D(&43(#3#%9'&1%BE3(#C3D#-.3#93,5&43#F#93(("%(#5%'2"(%(#G%-.&#3(4".#53#,303,&62"#F#%2"'3(13643(#(35#6%2%#9%,%#0%H3,#3

=%9I4.'"#JK7#L60",5%BE3(#M2&1&"6%&(

NO

Page 88: Livro Ruby on Rails 2.1

!"#$%&'($!)*&(+,$(+-".(."#$)$*)/-"0')$'"$123&/(!$4"56$&/*+78."#$*)/-"0')$9)!-&+6$":"*7-(."#$(-(;7"!$'"$19&!9&/36)5-"."#$)$*)/-.)+"$')$/(%"3(').$(-.(%<!$'"$*='&3)!$>(%(?*.&1-$"$/($#(&).&($')!$*(!)!$@).A(."#$)$7!72.&)$($":"*7-(.(+37#$*)#(/')$;7"$"+"!$'"!"B"#C$D!-"$0+-&#)$-&1)$'"$(-(;7"$!"$*9(#($*.)!!!&-"$.";7"!-$@).3".&"!C

E$F.)!!$?&-"$G";7"!-$H).3".&"!$<$7#$-&1)$'"$(-(;7"$;7"$*)/!&!-"$"#$)5.&3(.$7!72.&)!$+"38-&#)!$($":"*7-(."#$7#($!<.&"'"$*)#(/')!$!"#$/"#$#"!#)$!(5"."#$'&!-)C$D$(3).($*)#$)$(7#"/-)$')$7!)$'"$IB(:6$($*)&!($-"#$@&*(')$(&/'($1&).C

J($%".'('"6$"!-"$#<-)')$!".%"$1(.($/)!$(!!"37.(.$'"$;7"$-)')!$)!$@).#7+2.&)!$;7"$!7($(1+&*(AK)$"!-2$."*"5"/')$"!-K)%&/')$'"+($#"!#(6$"$/K)$'"$7#$+&/L$1".'&')$'"$(+37#$)7-.)$!&-"C$D+"$*)/!"37"$&!-)$&/*+7&/')$7#$-)L"/$5(!"(')$/($!"!!K)"#$-)')!$)!$@).#7+2.&)!$"$.";7&!&AM"!$IB(:$3".('(!$1"+)$G(&+!6$"$'"1)&!$%".&@&*($($(7-"/-&*&'('"$'"!-"$-)L"/$/)$*)/-.)++".C

N"#5."O!"$;7"$.";7&!&AM"!$%&($PDQ$/K)$!K)$1.)-"3&'(!C$R(!$&!-)$/K)$!".2$7#$1.)5+"#($!"$!)#"/-"$S$7!(.#)!$1(.($/)!-.(T".$'(')!6$"$/7/*($1(.($(+-".(.$)7$3.(%(.$(+3)$"#$/)!!)$5(/*)$'"$'(')!C

?"$;7&!".$(1."/'".$#(&!$!)5."$F?GHUF.)!!O?&-"$G";7"!-$H).3".V,$7!"$)!$"/'"."A)!$(5(&:)W

X 9--1WYY444C/)#"')B)3)C*)#YZ[[\Y[]Y]^Y*)#)O7#O3(.)-)O*9(#(')O!(#VO1)'"O'"..75(.O!"7O!&-"Y&!*C!(/!C).3Y'&(.VC9-#+_!-).V&'`]ab[

X 9--1WYY444C/)#"')B)3)C*)#YZ[[\Y[]Y]^Y*)#)O7#O3(.)-)O*9(#(')O!(#VO1)'"O'"..75(.O!"7O!&-"Y&!*C!(/!C).3Y'&(.VC9-#+_!-).V&'`]ab[

R(!$+"#5."O!"$;7"$&!-)$/K)$<$7#($!)+7AK)$'"@&/&-&%($1(.($/)!!)$1.)5+"#(6$)7$*)#)$*)!-7#(#)!$'&T".6$/K)$<$7#($5(+($'"1.(-(C

G75V$)/$G(&+!$ZC]$O$E$;7"$92$'"$/)%)_

\\

Page 89: Livro Ruby on Rails 2.1

!"#!$#$%&'(#)*%+""+,-.$&,'/#$,/#$)&+0&$1#,'2"$"#3'2"

!"#$%&'(')(*+,"-('%$)./$0('%&'1+234'&'/5*&%& 456789:*;8< 5'0,+0$(67'8+()*(9'#"-"9'):&';,"0$9(/&9'0<"0(,'9"'+//5*&%&'"=$9*"')&'&2>"*&'?+"'"9*(/&9'/()$;+6()%&4'&+'/"9/&'#",$@$0(,'9"'&'&2>"*&'5'/"9/&'(?+"6"'?+"'"9*(/&9"9;",()%&'A=6*><BC

D&,5/'*"/'(6E&'/+$*&'$/;&,*()*"'?+"'/+$*('E")*"'9"'"9?+"0"7'F">(';&,'"="/;6&'"9*('/$)<('06(99"'?+"'@(-'+9&'%&'/5*&%&?5;@8:*?=66=9AG

!"#$$ %#!&'((')*+ ,*-&').,/$$/012!"#$%&' !()*+' ",-%./3/+ ,*-&')4-'.$ 56 78"#-/(79:-$ ;#:#:<;

*"$*$:9*(

*0)*0)

*0)

(*= 5 %#!&'(('40*>(*=4"#-/( 0123(4(45(*=4"#-/(< 0123(4(45(*=4"#-/(.*.!'((*( 0123(4(45

H0<&'?+"'#&0I'>J'%"#"'0&)<"0",'&?5;@8:*?=66=9A4'):&C'F">('?+"')&'"="/;6&'(0$/('"+'"9*&+'0,$()%&'+/('$)9*.)0$(%('06(99" B>C@8448 "'0<(/()%&'&9'/5*&%&9 D>;=44 D>;=4E " D>;=4*5*C84454 ?+"'):&'"=$9*"/7'D&,'$9*&'&'/5*&%&?5;@8:*?=66=9A 5'%$9;(,(%&4'&)%"'"+'+9&'+/('"=;,"99:&',"E+6(,'9$/;6"9';(,(',"*&,)(,'K(+(+LK'0(9&'&')&/"'%&/5*&%&'0&/"0"'0&/'('"=;,"99:&'6(*$,7

M(9'#">('&'?+"'(0&)*"0"'?+()%&'*")*&'+9(,'&'/5*&%& 456789:*;8<G

N(;O*+6&'PQG'R)@&,/(ST"9'H%$0$&)($9

UV

Page 90: Livro Ruby on Rails 2.1

!"#$!"%&'()*+', -./+0! !"#$%&'()!"#$./+0! !"#$&*&*+

!"#$%#&'%()$*)"+#,$#$-+&'$*).$&'/'$'$+#(&-/'$01$23#$'$45&'/'$%#)"4#(&#$(6'$#7-+&#8$!(&6'$*-9)$()$4-(:)$%#+;'(+)<-"-/)/#)"&#%)%$'$45&'/' !"#$%&'()%* ;)%)$23#$#"#$*3(9-'(#$/-%#-&'$3+)(/'$#+&)$4-(:)$%#=%)$#+;#9-)"8$>'3$)"&#%)%$4-(:)$9")++#;)%)$-+&'?

1./%% 2/13'!!'456787*9:6;< = >?./+0!>

)"@ !"%&'()*+',A,)-./0B!"+C!( +!C" 0@ D"+3')$+'*% =E 456787*9:6;<%C&"!

"()

)"@ D"+3')*D0%%0(FA,)-./01 !&23(1 "4'/56B0@ D"+3')$+'*% =E 456787*9:6;<&C+% G/C/CHG

".%"%C&"!

"()"()

"()

!"# = 2/13'!!'$("I!"#$!"%&'()*+',A-./+0!B !"#$-2*)!"#$./+0! !"#$&*&*+

@='%)$+-4A$!+&#$5$34$#%%'$9'434$23#$&#(:'$B-+&'$#4$)"=3(+$9C/-='+,$-(9"3+-B#$('$;%C;%-'$D)-"+,$&#(&#$#7#93&)%$34!"#$%&'()%* ;)%)$B#%-*-9)%$)$#7-+&E(9-)$/#$45&'/'+$9'4' +,&'(-.(&/0",$;'%$#7#4;"'8

D3<F$'($D)-"+$G8H$I$J$23#$:1$/#$('B'K

LM

Page 91: Livro Ruby on Rails 2.1

!"#$%&%"'(%)*+,"(,-'%*'./-00*1+(+2-%-%3)-456-)%(1%'74*'18%'(0%0-%+91%21'(/'10%:"*;(;1%.1;-'10%;-*4(/%.1+2(0%01)2(0:1'1%-02(<

=)(/1%>"-%+1%!(*)0%?<@%:1//*,*/('%-02-%./1#)-'(8%.1;-/-'10%"0(/%1 !"#$%&'()%* .(/(%6-/*3*:(/%(%-4*02A+:*(%;-%'&21;10:1'1%1 +,&'(-.(/0123/(4%,#/<

56789:;7<=

B1%!(*)08%1%(;(.2-/%(2"()%.(/( 5%#)1!"7<= 01'-+2-%2-'%0".1/2-%.(/(%(0%6-/0C-0%D<@%(2&%(%D<E<%F,1/(%31*%(:/-0:-+2(+;10".1/2-%;-0;-%(%6-/091%G<H%(2&%(%D<E<

=(.52")1%@HI%J+31/'(KC-0%F;*:*1+(*0

L@

Page 92: Livro Ruby on Rails 2.1

!"#$%&'()*+

!,-./012/

-!342.5-4106

!"#$%&'"()*("*"+&(,+-./*()")&*'&+"01,2'"3&"$4-1+&'"56768"9:11;(<

!"=&;;">&+31;&"?*$2"2144$-4@":,;("+&A$/$&-(;"B1+"@$-B1"214"2&>&2C"()&"0)12&"&?*$2"B1+"@'&3,4"1-2DE"5FGGG"9$*''$A(H"I*+?1IJ-*><

!"K/'*(&'"IL*$2"(1">&+;$1-"ME8EM"9+**;'-$2<

!"#$%&'"()*("D1,"'1-N(")*>&"(1"A*22";,/&+"$-"OA($1-L*$2&+@@I&;(P*;&5;&(,/"5MGQGR"9:*?&;412$AS<

T,3D"1-"T*$2;"8EM"."U"V,&")W"'&"-1>1X

Y8

Page 93: Livro Ruby on Rails 2.1

!"#$%&'!"(

!"#$%&'$()*'+,-).'/0&1&23)1.453156&25$%"57)4.058%"&5"9'&)*23)":;)5.."</)%2$+=

!">2?)-"&@'&".54+)4A"645&)(&25$"('$"B)"/%)-"82&@5/&"%)%%25$"&4'(C2$+"DE)&)4"F5$)%G":,HIJ=

!"K--)-"%)%%25$DL5$G"&5"&/4$"%)%%25$"3'$'+)3)$&"B'(C"5$"2$"'"(5$&4500)4"%/B(0'%%"2."&@)"%/6)4(0'%%"&/4$)-"2&"5.."DE)&)4F5$)%G":,HIM=

!"N@'$+)"&@)"4)O/)%&".54+)4A"645&)(&25$"&5"+5"BA"N5$&)$&P*A6)"2$%&)'-"5."4)O/)%&Q.543'&"%5"&@'&"A5/"('$R&"BA6'%%"2&"BAEST*2$+"&5"U,V4)O/)%&Q/42WQ?30U":42(C="!"#$%&'$()*'+,-).'/0&1&23)1.453156&25$%"82&@"@'%@"'4+%"/%)%"*23)Q(/44)$&"'%-).'/0&X"4)%6)(&%"@'%@"%)&&2$+%"8@)$"&23)".'00%"2$"%A%&)3"05('0"%642$+"9T*"+'6":;)5.."</)%2$+=

!"%)0)(&1-'&)"-).'/0&%"&5"*23)QY5$)Q&5-'A"8@)$"(5$.2+Q&23)1Y5$)"2%"%)&":;)5.."</)%2$+=

!">2?)-"&@'&"*)?&Z)06)4,&)?&1.2)0-"85/0-"(544A6&"8@)$"4'8"Z*[\"8'%"/%)-"'%"&@)"7'0/)"D3(@)$4A(]"^)72$";058'(YG:,_`=

!"K--)-"K(&25$N5$&4500)4LL*)%&N'%),4)%(/)1'(&25$12$16/B02(a"&5"(5$&450"8@)&@)4"&@)"'(&25$"/$-)4"&)%&"%@5/0-"/%)"&@)4)+/0'4"4)%(/)1'(&25$"6'&@"2$%&)'-"5."%2360A"4'2%2$+"&@)")?()6&25$"2$02$)"D+4)'&".54")4454"&)%&2$+G":9ZZ=

!"b)-/()"$/3B)4"5."2$%&'$()"7'42'B0)%"B)2$+"(562)-".453"(5$&4500)4"&5"72)8Q":E4'&2C=

!"%)0)(&1-'&)&23)"'$-"%)0)(&1&23)"-).'/0&"&5"*23)QY5$)Q$58"8@)$"(5$.2+Q&23)1Y5$)"2%"%)&":;)5.."</)%2$+=

!"-'&)&23)1%)0)(&"-).'/0&%"&5"*23)QY5$)Q$58"8@)$"(5$.2+Q&23)1Y5$)"2%"%)&":;)5.."</)%2$+=

!"b)357)"K(&25$N5$&4500)4LL<'%),72)81(5$&4500)412$&)4$'0%".0'+Q":E4'&2C=

N'6c&/05"HdL"NZKe;f\S;

JI

Page 94: Livro Ruby on Rails 2.1

!"#$$"%&'$()(&'*+"&,)(&'-")&"%*%./-0,*1/"2/).&$3"45*6+"7&8-9*++:

!";&</"2(--('1")/2,+*)/"+&1(%")&"#%)(&'=(/>3"458*)(?:

!"@')8&$6%/"#%)(&'=(/>AA@'+('/B/2,+*)/"%+*--3"458*)(?:

!"#6)&2*)(%*++C",*8-/",&-)/$"DEFG"%&')/')"9&8";(2/AADEFG"8/H6/-)-3"48(%?:

!"#$ %&'()(*+&'()+,-*+).)/0+, +12034.56-708(+99

:0; <203)0=&'() > !'()?<203)0 &323@(A,&'()B! """

05:

!"*$$"I-&'0/-%*,/"JKL"6)(+")&"/-%*,/".)2+"/')()(/-"('"I-&'"-)8('1-").*)"*8/"&6),6)"('"7B;M",*1/-3"48(%?:

!"58&<($/"*"./+,/8",8&NC")&"*%%/--"./+,/8"2/).&$-"98&2"&6)-($/"<(/>-3"O+&-/-"PQRSTU"4D&-."5//?:"/313#,,+(%*)(&'O&')8&++/83./+,/8-3-(2,+/09&82*)V)/N)W

!"@2,8&</"$&%62/')*)(&'3"4X*<(/8"G&8(*Y"+//).*+Y"I/8&2/:

!"J'-68/"KDE"8/$(8/%)0)&"$&/-'Z)".)2+[/-%*,/-"-)8('1"*8162/')3"O+&-/-"PS\]^"4I&-.Y"/</')6*+_6$$.*Y"58*)(?:

!"E6,,&8)"8/'$/8"A,*8)(*+"`a"%&++/%)(&'"&9"./)/8&1/'/&6-"/+/2/')-3"PQQ]UQ"4b*%."c/''(-:

!"#<&($"8/2&)/0(,"-,&&9('13"4L8(*'"O*'$+/8:

!"#$$/$"-6,,&8)"9&8"8/1/N,"9+*1-"+(?/"(1'&8('1"%*-/"('")./"A8/H6(8/2/')-",*8)"&9"8&6)/-"$/%+*8*)(&'-"PQQ]dQ"4G/(+e:

K6_C"&'"K*(+-"d3Q"["F"H6/".f"$/"'&<&g

U]

Page 95: Livro Ruby on Rails 2.1

!"#$%&'"()*("+,($-./-.(0-11&0223*4&50&*'6781($9*0(":-81'";*$1"$;"<-8.'*0=":*4"&%*,(1=">?@A?"<=(&4"5>?BBC"D*0$&E*.F

!"#$%&'"GHIJ22H-K&.$L&0"M84&'"$."4*.$($L&")&19&0N"'$'.O(")*.'1&"8.,1-4&'"/P+H+"(*Q4"5>??R>"D&4*'S"9*,K*Q&()$&;F

!"T790-U&"'-,87&.(*($-.V"DW*'*0S"X*."P&"Y--0(&0S",)8=&-:S"%*U$&04)*=S"'*.Q&0S"7$1--94S"Z*U$&0"[-0$*S"\8..="W$9&0(F

!"#$%&'"()*("#-07G&19&050*'$-6<8((-.":-81'"90-'8,&"$.U*1$'"$'4"5>>@]B"D)*01*.,0=4(*1F

!"+''&'"2,-.;$07"-9($-."(-"48<7$(6(*Q"5>>A>^"D7$1--94F

!"#$%&'"[87<&0G&19&05.87<&06:$()690&,$4$-."(-"90-9&01="0-8.'"$."*":*="()*(":-0K4"&_8*11="-."I*,S"`$.'-:4S"J$.8%M,1-4&4"5>>A?]S"5B@R^S"5>??]?S"5B?@RN"DL)*.Q=8*.=$F

!"+11-:"()&"54$791&6;-07*("(&%(6)&19&0"(-"(*K&"*.")(716-9($-.4")*4)";-0"&*,)"9*0*Q0*9)V"5@AAB"D#0*.,-$4"3&*84-1&$1S()&,)0$4-4)-:F

!"#$%"0&Q0&44$-.";0-7";$1(&0"0&;*,(-0$.Q":)&0&"0&a*''$.Q"*"4K$99&'";$1(&0"0&481(&'"$."$("<&$.Q",*11&'"(:$,&V"D0$,KF

!"W&;*,(-0";$1(&04"(-"84&"+,($U&"\899-0(",*11<*,K4V"5>>@b^"DX-4)"Y&&KF

!"#$%&'"()*("9-1=7-09)$,"0-8(&4":-81'"7-'$;="()&"$.98("*00*="5>>bCb"D()-7*4V1&&F

!"+''&'"2;-07*("-9($-."(-"[87<&0G&19&05.87<&06(-6,800&.,="(-"&.*<1&"<&((&0"1-,*1$L*($-."4899-0("5>>>A]"D1=1-F

!"#$%&'"()*("H&%(G&19&05&%,&09(":-81'"$.,18'&"-.&",)*0*,(&0"(--"7*.="5>>@CB"DT0;=F

!"#$%"7-0&"-<4,80&".&4(&'"9*0*7&(&0")*4)"9*04$.Q"<8QV"5>?R]R"D()-7*4V1&&F

/*9c(81-">^2"/G+[deJfd

]^

Page 96: Livro Ruby on Rails 2.1

!"#$$%$"#&'()*+(%,--.%/0%12--1%3(2'%1456762&1(0'82'9/%2:%%'4%;06*2()*"')"<6=%"('"%62(%1">)1"0/?3(*"$%7%/)0%12"')"(*5%&'<?/'(0/%"622%'2@"ABCDEC"F/)'2,:)/%'(<%G

!"H(;"*%2'%$"0616<%'%1":62:"0612(*3"I?3@"ABCJKJ"F':)<62@/%%G

!"#//),"?2(*3"*6<%$"1)?'%2"(*"#&'()*L)*'1)//%1--M%2'L62%"I%>)1%"6*9"1%N?%2'":62"I%%*"<6$%@"L/)2%2"ABBOJD"F6//)9G

!"H(;%$"':6'"2,%%0%12"$%>(*%$"I9"&6&:%42,%%0%1",(//"I%"6$$%$"1%361$/%22")>"':%"0%1>)1<4&6&:(*3"2%''(*3@"P*2'%6$Q"&)*'1)/,:%':%1"':%"2,%%0%1"2:)?/$"I%"1?*",(':"':%"0%1>)1<4&6&:(*3"2%''(*3@"M:(2"<6=%2"'%2'(*3"%62(%1",:%*"9)?",6*'"')"'?1*0%1>)1<4&6&:(*3")*8)>>"FR..G

!"S6=%"S(<%T%20)*$2--T%20)*$%1A6*9",)1=",(':)?'"%;0/(&('"'90%2@"L/)2%2"ABBBUC"F56,VG

!"W%''%1"%11)1"<%2263%">)1"'90%"&)*>/(&'2",:%*"0612(*3"0616<2@"L/)2%2"AJKVO"F20(&9&)$%Q"<6''G

!"T%<)7%"?*?2%$"#&'()*L)*'1)//%1--W62%@'%<0/6'%4&/622@"L/)2%2"ABCJXJ"FY16'(=G

!"S)7%$"'%<0/6'%":6*$/%12"1%/6'%$"&)$%">1)<"#&'()*+(%,--W62%"')"#&'()*+(%,--M%<0/6'%@"FY16'(=G

!"M%2'2">)1"$(74>)1"6*$"&)*'%*'4'634>)1":%/0%12@"L/)2%2"ABBOOD"F':%&:1(2)2:),G

!"#//),">(/%"?0/)6$2"(*"P*'%316'()*"M%2'2@"L/)2%2"ABBCKB"FT?I9T%$T(&=G

!"T%>6&')1"061'(6/"1%*$%1(*3"(*')"6"Y61'(6/M%<0/6'%"&/622@"FY16'(=G

!"#$$%$"':6'"1%N?%2'2",(':"Z676[&1(0'"62"':%"01()1('9"<(<%"'90%"(*"':%"6&&%0'":%6$%1"6*$"*)">)1<6'"%;'%*2()*"(*"':%0616<%'%12",(//"I%"'1%6'%$"62"':)?3:"':%(1">)1<6'",62"-52",:%*"('"&)<%2"')"$%'%1<(*(*3",:(&:"'%<0/6'%"')"1%*$%1@"M:(2<6=%2"('"0)22(I/%">)1"Z["1%N?%2'2"')"6?')<6'(&6//9"1%*$%1"6&'()*@52@152">(/%2",(':)?'"6*"%;0/(&('"1%20)*$4')"I/)&="FR..G

T?I9")*"T6(/2"O@B"\"]"N?%":^"$%"*)7)_

KV

Page 97: Livro Ruby on Rails 2.1

!"#$%&%"'()"*+%&,-.$/('/&+0$/+-/1()*%"1+&2"#+0$3+&24(-$"+-%&,-.$%5"67(%$%"89:;9<"=$)-$%&(5>+0$-$?@

!"A$0(B$"%CDD()&"'()"0C7&+B,7C$*"E$5F5G"HIHJ*$7+0+&$*K".((L+$%5"=M,0+%"NC.L@

!"O+P"D)(Q7$0"1+&2")$-*$)"RD,)&+,7".(77$.&+(-%G")$.()*%G",-*"7(.,7%5"899:ST"=7(&%12(7$&+0$@

!"U**$*"%CDD()&"'()"-,0+-F".(-.)$&$".7,%%$%"+-"%1$$D$)"*$.7,),&+(-%"=VWW@

!"A$0(B$"XAN"&)+0"B,)+,Q7$%"')(0"&),.$"&$0D7,&$"+-".,%$"U.&+(-Y+$1RRN,%$5$)Q/&)+0/0(*$"+%".2,-F$*"+-"&2$",DD7+.,&+(-589::;Z"=&D(D$G"L,0D$)%@

!"O+P"&[D("+-"'()0/2$7D$)"*(.C0$-&,&+(-5"89:\S:"=P,B+$)%2,[G"L,0D$)%@

!"O+P"QCF"1+&2"%$&&+-F"A$]C$%&8'()0,&^",'&$)"&2$"F$&&$)"2,%".,.2$*"&2$"B,7C$5"89:ZZ;"=..29@

!"6())$.&"+-.(-%+%&$-.+$%"+-"A$]C$%&O()F$)[_)(&$.&+(-"*(.%5"899:`a"=0+%7,B@

!"b-&)(*C.$","#$0D7,&$".7,%%"&("U.&+(-Y+$15"899:a<"=7+'('+'(@

!"b-&)(*C.$"&2$"R+-*$P"(D&+(-"'()"'()0/'()",-*"'+$7*%/'()"&("%+0D7+'["0C7&+J0(*$7"'()0%"E%$$"2&&DRcc),+7%.,%&%5.(0c$D+%(*$%cTSK5"8;ZZ`"=)00S&@

!"b-&)(*C.$"0,D5)$%(C).$%"R.,)*%G"R,%"^d"H&,)>$&,%H"&("C%$",".C%&(0")$%(C).$"-,0$"+-"&2$"eAfR".,)*%/D,&2"^^"Hc&,)>$&,%H589:STZ"=Q7>@

!"#$%&g$%%+(-"%CDD()&%"+-*+''$)$-&",..$%%5"8T`Ta"=&,0.G"U)%$-TG"02,.L$&&G">C7+LG">$,-52$7(C@

!"h,L$",%%$)&/)(C&+-F",1,)$"('"&2$"W##_"0$&2(*"C%$*5"8Z:`;"=0D,70$)@"$5F5",%%$)&/)(C&+-FEi"R0$&2(*"^d"HDC&HG"RD,&2"^dHcD)(*C.&c`a9H"jG"i"R.(-&)(77$)"^d"kD)(*C.&kG"R,.&+(-"^d"kCD*,&$kG"R+*"^d"k`a9k"jK

6,Dl&C7("9SR"6WUmnXfon

;T

Page 98: Livro Ruby on Rails 2.1

!"#$%&"'$()*++,"$--&(,"$"./012&".3'4+2"$."$0"$*15'&0,",+"6&-2$*&"$0"$2/$.)"789:8:";4.-+</&26=

&)1)"'$()6$.>4+$*6"?@6$.>4+$*6?A"B-+0,*+22&*CD?6$.>4+$*6?

!"#$%&&' ()"*+,&"%)

!"E$062&"-+*0&*"-$.&"F/,>"/'$1&G,$1"F>&0"($..&6"?'&..&6"5(?"/'$1&"0$'&.)"7H98:";650-$04&&I&*.A"'($2'&*=

!"J66"2$4&2G,$1">&2(&*"<+*"1&0&*$,/01"&2&'&0,.)"789:9K";L&<M=

!"N0,*+65-&"O&'(2$,&P/06&*",+">$062&"I/&F"($,>."$06"2++%5(.)"789:99";Q*$,/%"R$/%=

!"Q&*<+*'$0-&B"+(,/'/S&"*+5,&"*&-+10/,/+0)"T$*1&".(&&65("<+*"$((."F/,>"'$03"*&.+5*-&"*+5,&.)"789:UV";+2&1$0S$=

!"#$%&"*&06&*"B($*,/$2"*&-+10/.&"<+*'"45/26&*."$06"5.&",>&"G<+*'"($*,/$2)"789:8W";6X$0+F.%/=

!"J22+F"5.&*.",+"6&-2$*&"+,>&*"0$'&.($-&."F>&0"5./01",>&"$,+'"<&&6">&2(&*.)"789U9W";6$I/6)-$2$I&*$=

!"N0,*+65-&".&06G</2&"BYG.&06</2&"CD",*5&",+".&06"$0"Z[\&06</2&"*&.(+0.&">&$6&*)";]&*&'3"^&'(&*=

!"P/Y&6"J-,/+0M/&FBBE&2(&*.BBJ-,/I&_&-+*6E&2(&*BB<+*'"<+*"F>&0"(*+,&-,G<*+'G<+*1&*3"/."5.&6"789`UH";X&*&'3&I$0.=

!"Q*+I/6&"0/-&*"$--&..",+"EOOQ"E&$6&*.)"N0.,&$6"+<"*&a5&.,)&0I;bEOOQG_cPc__c_b="3+5"-$0"0+F"5.&*&a5&.,)>&$6&*.;b_&<&**&*b=)";^+S=

!"d*2e*/,&*"*&.(&-,."*&2$,/I&G5*2G*++,)"789`W:";f>&$>"f>5"g&+F=

!"O>&"$..&,G>+.,"42+-%",$%&.",>&"-+0,*+22&*"*&a5&.,"$."$0"+(,/+0$2".&-+06"$*15'&0,)"cY$'(2&B"5.&"$"./012&"$..&,">+.,"<+*\\T"*&a5&.,.)"789VWH";f>&$>"f>5"g&+FA"Q&,&*"hA"O+'"O$32+*=

_543"+0"_$/2."K)8"["i"a5&">j"6&"0+I+k

H:

Page 99: Livro Ruby on Rails 2.1

!"#$%%&'("')*+)'",()-("./"*012"34456"7(8)**0*9:;"<&(=(&#=1=+;">?)=?">?$"@)&AB

!"=::)'(C'):%&*:)"D=01$'):"0*E1$+)"(?)")-E)%(0&*"F)::=9)2"3GH455"7#)(?"I=:F$::)*B

!"J11"D'=9F)*("E=E?)"K)L:"=')"*&A"ML"+)D=$1("%')D0-)+"A0(?"(?)"NO0)A:PN"*=F):%=E)"7QRRB

!"S&O)+"(?)"E=E?0*9":(&'):"D'&F"JE(0&*>&*('&11)',,>=E?0*9,,T'=9F)*(:,,!"(&"JE(0O)#$%%&'(,,>=E?),,!2"UD"L&$V')")-%10E0(1L')D)''0*9"(&"=":(&');"10K)"JE(0&*>&*('&11)',,>=E?0*9,,T'=9F)*(:,,S)F&'L#(&');"L&$"*))+"(&"$%+=()"(?=("')D)')*E)"A0(?JE(0O)#$%%&'(,,>=E?),,S)F&'L#(&')"7QRRB

!"Q)%')E=()+"JE(0&*>&*('&11)',,W=:)2D'=9F)*(CE=E?)C:(&')"D&'"JE(0&*>&*('&11)',,W=:)2E=E?)C:(&')"7QRRB

!"S=+)"D'=9F)*("E=E?0*9"0*"O0)A:"A&'K"D&'"'8:"=*+"M$01+)'"=:"A)11"3446X"7Y:&FM&'B

!"T0-)+"')*+)'0*9"&D"%='(0=1:"A0(?"1=L&$("A?)*"+&*)"D'&F":0()"1=L&$("3ZXHZ"7=*('=FFB

!"T0-"=(&FCD))+C?)1%)'"(&"E&F%1L"A0(?"(?)"=(&F":%)E2">1&:):"3GH4[X"7-=O0)':?=LB

!"# $%&'()*#%$#+ +, -,$ ),-$%.-(%(+%$#(/"$$01223##+4%5.+%$,*6,*&2+,)'2#**,*27-4%5.+!896"$:5;7<' %*# -,$ &=%*%-$##+(=-.>=#8 +#3%=5$ '#53 5.-?(@%' -,$ 0*,4.+#+A(),-$*%*B($,($"#(+,)=:#-$%$.,-CD!E1 !".' )"%-&#'($%&' 3,* #F.'$.-&(%$,:(#-$*.#'A(G=$(%$(5#%'$($"#B(4%5.+%$#(-,@6

!">&'')E("0*+)*(=(0&*"0*"():(:2">1&:):"3GH4[G"7129$0+0B

!"T0-"(?=("=$(&C10*K"1&&K:"D&'".V:"0*"$'1"%=(?:"\JF=Y&*"$'1:"?=O)"(?)F]2">1&:):"3GH46H"7M9'))*1))B

!"^*:$')"(?=("():("E=:)":)($%"0:"'$*")O)*"0D"&O)''0++)*2"3GH_5X"7`&:?"<))KB

>=%a($1&"Gb,">RJcd^efd

ZZ

Page 100: Livro Ruby on Rails 2.1

!"#$%"&'()"*+,$-$./0"-1"+2213"-0+$2$,4"56+7/5"$,"8**"5-92/"+--0$:;-/5<"8215/5"=>?@AA"B3/52/9<C1%+CD

!"EFF"GF/H+;2-"16-$1,"-1"-$C/I.1,/I5/2/7-<"=>?@J?"B(+--"E$C1,/--$D

!"#$%&'&"(')

!"EFF"E7-$K/L/710FGGM+5/<5-$I,+C/"-N+-"7N/7O5"E7-$K/L/710FGGM+5/=5-10/IH;22I5-$I72+55P"+,F"0/-;0,5"/$-N/0"-N/"H;22"10F/C1F;2$./F",+C/<"B0$7OD

!"EFF"H$05-Q2+5-"C/-N1F5"-1"+5517$+-$1,5Q,+C/FI5716/<"L/512K/F"=RRA<"BL9+,"M+-/5D

!"EFF/F"*S)"/57+6$,4"H10"G2$C$-"+,F"G1HH5/-"=RTT"BE+01,"M/F0+U"*-/K/,"M0$5-12U"V1,+-N+,"W$/55D

!"EFF/F"H$05-Q2+5-"C/-N1F5"-1"+5517$+-$1,5Q,+C/FI5716/<"L/512K/F"=RRA<"BL9+,"M+-/5D

!"X,5;0/"NCG-"60/21+F$,4"N1,1;05"0/H2/7-$1,"16-$1,5<"L/512K/5"=>YZ<"B#0/F/0$7O"8N/;,4D

!"EFF/F"601-/7-$1,"+4+$,5-"F;62$7+-/"C$40+-$1,",+C/5"[E52+O"&/22/5\9]"B=>>RD

!"M+5/=$,5-+,-$+-/I-$C/I1:^/7-G"/2$C$,+-/"7N/7O"H10"'$C/<.1,/U"5$,7/"3/"7+,"+55;C/"-N$5"$5"5/-"$H-$C/I.1,/I+3+0/I+--0$:;-/5"$5"5/-"-1"-0;/"B_/1HH"M;/5$,4D

!"'$C/".1,/"+3+0/"+--0$:;-/"C/-N1F5";5/"'$C/<.1,/<6+05/"$,5-/+F"1H"=-1I-$C/"H10"*-0$,4"+04;C/,-5U"51"-N+-"1HH5/-$,H10C+-$1,"$,"*-0$,4"$5"0/56/7-/F<"L/512K/5"=>?@<"B*71--"#2/7O/,5-/$,U"_/1HH"M;/5$,4D

!"EFF/F"7N+,4/I-+:2/"H10"C$40+-$1,5"[V/HH"`/+,]"B=Z>D<"X%+C62/G

L;:9"1,"L+$25"R<>"a"b"c;/"Nd"F/",1K1P

>??

Page 101: Livro Ruby on Rails 2.1

!"#$%&'(#)*& +,-.&/0 ./ 1(1(2(-3&0(#340 ! "##$%&'(")(#*")+%,-#")(#*")(2)&*/$%0'(/ +%/#( ! "##$%./")*0#%01)(.('(20(5-$% +$#3&6 +&3#-*6 +*-3-( 78 9: ! "##$%1"2(%"1#%(2"03%4/)5%60)5%"%78%&5"'%3020)(25&3/,& +$#3&6 +&3#-* ! '(2/9($%)5(%1"2(%"1#%(2"03%&/3,21$

&$.

!"#$%&'"()*+,)-."/0(1234("561&)0&"7$0("-2"8)1),&0&1*"6)3*&'")"96)-:0"'38";$<=<)**9"&1121">?0&@&-"?212A)B"CDEFG

!"H''&'"I<26AJ*&00$-4"2K")001$I30&*"K21"L)*&561&)0&"<$A&"L)*&5-&7")<1&)'."()*">H'),"M&&()-B"CDNOG

!"#$%&'"0()0"8&**$,$*0$6"<26A$-4".23"1&K&1&-6&"0(&"P320&'"0)I<&"-),&">Q2*("?3**&1B"CDRSG

!"#$%&'"0()0"6()-4&+62<3,-"*(23<'"I&")I<&"02"3*&"/-3<<"TU"013&"2-")"K$&<'"0()0"K21,&1<."()'"K)<*&"C;)0&"V$4&1G"CDWRG

!"H''&'"0()0"0(&"M.?XY")')80&1"*(23<'",)8"$-0&4&1"02"&$0(&1"*,)<<$-0Z"$-0Z"21"I$4$-0"'&8&-'$-4"2-"0(&"/<$,$0"[3*0"<$A&\2*041&?XY"C]^^G

!"=()-4&"@)<$')0&*+3-$P3&-&**+2K"/6)*&+*&-*$0$@&"280$2-"'&K)3<0"I)6A"02"013&">K12,"CO_R`GB5"Y2@&".231"')0)I)*&"62<3,-*Z'2-:0"YaVbc"0(&,5"C1$6AG

!"H''"*388210"K21"$-0&1<&)@$-4",$41)0$2-*"I."*021$-4"7($6(",$41)0$2-*"()@&"13-"$-"0(&"-&7"*6(&,)+,$41)0$2-*"0)I<&5=<2*&*"D__dON"C[21'$G

!"H60$@&c&621'//L)*&D*3,"'&K)3<0*"02"`"$K"-2"127*")1&"1&031-&'5"=<2*&*"D__FF`"CA),)<G

!"b-*31&"0()0"1&*82-'+02e"62-*$'&1*"'.-),$6"K$-'&1",&0(2'*5"=<2*&*"D__FNE5"CK<2&(288&1G

!"b-*31&"0()0"*)@&"2-"8)1&-0"2I[&60"K)$<*"K21"$-@)<$'"()*+2-&")**26$)0$2-5"=<2*&*"D_`F_E5"C\1)0$AG

=)8f03<2"_F/"=^H;gbYag

_`_

Page 102: Livro Ruby on Rails 2.1

!"#$%&'$"()*+,-./$"-&($"01&%".22&-,./,&324"561./,78

!"#$0.-/&1"9.2:.3;<=1&)>=?22&-,./,&3"/&",3=$1,/"01&%"9.2:.3;?22&-,./,&34"?22&-,./,&3"[email protected]".3( A,(2B"3&C"C&17C,/="=%D/4"EFFGFH"51)@;1);8

!"I32)1$"9?J<:E-1$./$".3("9?J<:E@),+("(&"3&/"+&.("$3/,1$".22&-,./,&34"561./,78

!"K%*1&'$"(&-)%$3/./,&34"5L.',$1"M&1,.N"O.-7"P.3>$1"Q.3/;N"+$$/=.+8

!"<C$.7"?-/,'$#$-&1(DDJ.2$E/&AR2&3"/&",3-+)($"."1&&/"'.+)$",3"/=$"1$/)13$("=.2=D"ST*&2/TD"ST/,/+$TD"444UU"51,-78

!"#$%&'()*+,%$"-.#"( ! "#$%&'(')*&+$,,,-/"(&'0%1/$'23-43/"4)%'(/56)3-4""$-'(-.#"( 7 $463!"#$%&'()*+,%$"-.#"( ! "#$%&./0'&+$%&'(')*&+$,,,--

!"?(("$00,-,$3/"E,3-+)($V"/&"?22&-,./,&3Q&++$-/,&3"W0&1"=.2A%.3;X=.2A%.3;"D/=1&)>=X=.@/%Y4"52/&*(1&*.3(1$C8

!"6&2/>1$Z[\D"-1$./$A".3("(1&*A(./[email protected]$"2)**&1/4"E]^_`"5$aN"*$(aN"3,-72,$>$18

!"I32)1$"/=./"'.+,(./$2A)3,b)$3$22A&0"C&172"C,/="C,/=A2-&*$4"Q+&2$2"E]`cG4"53,74C.7$+,3N"-.'.++$8

!"6.1/,.+")*(./$2",3-+)($"&3+;")32.'$(".//1,@)/$24"d00"@;"($0.)+/e"2$/"f&)1Q+.224*.1/,.+A)*(./$2"B"/1)$"/&"$3.@+$4"5O$1$%;g$%*$18

!"#$%&',3>")33$-$22.1;")2$2A/a,30&"=$+*$1"01&%"/$2/2N">,'$3"/=./"<hK30&",2"3&C"@)3(+$("5i$&00"J)$2,3>8

!"j,k$("/=./"'.+,(./$2A2,a$A&0"DC,/=,3"C&172",3".22&-,./,&32"EFF`]GN"EF^^F]"5-.'.++$8

!"<1.-7"-=.3>$2"/&")32.'$(".//1,@)/$24"5O$1$%;"g$%*$18

#)@;"&3"#.,+2"`4F"l"d"b)$"=m"($"3&'&V

F^`

Page 103: Livro Ruby on Rails 2.1

!"#$%&'()*"&+",-./&%0)123)*"4)53%+6"6701)53"8+5"0%952&%+63"26*"&()"3'()02:"-(%3"$%;;"23"9++*"23");%0%62&)"&()"<5+1;)0+8"07;&%<;)"0%952&%+63"9)&&%69"&()"320)"4)53%+6"233%96)*"%6"*%88)5)6&"1526'()3:"=;3+"2**)*"52>)"*1?0%952&)?7<@*+$6"&+2<<;A"%6*%4%*72;"0%952&%+63"&(2&"02A"6))*"&+"1)"576"$()6"A+7"0)59)"1526'()3"BCCDEF"GH1256)&&)I

!"J%K)*"&(2&"(23L026A"?&(5+79("$+7;*"%96+5)"&()"(23("'+6*%&%+63"BCCDDM"G0%;++<3I

!"J%K"%337)"$()5)"&()"?76%N"+<&%+6"+8"2"(23L026A"?&(5+79("233+'%2&%+6"%3"%96+5)*"$()6"8%6*O?2;;P"%3"'2;;)*:".;+3)3"BQDRMG'242;;)I

!"J%K"*7<;%'2&)"&21;)"2;%23")55+5"$()6"%6';7*%69"26"233+'%2&%+6"$%&("2"(23L026A"?&(5+79("233+'%2&%+6"+6"&()"320)"H+%6"&21;):.;+3)3"BMSCR"G'242;;)I

!"T+5)")88%'%)6&"233+'%2&%+6"<5);+2*%69"'+*)"&(2&"'+0<2'&3"2"&(5+79(L5)'+5*3"2552A"%6"2"')6&52;";+'2&%+6:".;+3)3"BCCDUMG*269)5I

!"V0<5+4)"*+'70)6&2&%+6:"GW2*25X"Y26"Z)"[++5&)5X"'(7A)+$X"K24%)53(2AX"*269)5X"0%;++<3X"\24%)5"]+5%2X"#766A"W%<)5&I

!"J%K)*"&(2&"='&%4)W)'+5*B^23):8%6*L+5L'5)2&)@%6%&%2;%_)"$+7;*"6+&"(+6+5"2&&5L<5+&)'&)*@2'')33%1;)"$()6"73)*"$%&("2(23("BCCDUU"G0%;++<3I

!"=**)*"='&%4)W)'+5*B^23):2;;@8%53&@;23&"23"2;%23)3"8+5"8%6*O?2;;@?8%53&@?;23&P"BCCDCS"G6>2;;)6X"&()'(5%3+3(+$I

!"T)59)"&()"(23L8%6*)5"9)0X"5)620)*"23"`620)*L3'+<)`:"BCCDRD"G6>2;;)6I

!"#$$ %&'(!") ! "#$%&'('#)*+,,-./'*#+),-$!./) 0/12"($3),4 0!.*,('(.*$ 56780/12"($3), 56 '&1)9*#+),-$!./) 0/./1"#&4 0!.*,('(.*$ 567:::

)*,

%&'(!"):/12"($3),:/#;(*#')<0/#;) 56 =>

.2<a&7;+"CE?".b=]cdefc

CRS

Page 104: Livro Ruby on Rails 2.1

!"#$%&'()*+&$,-'.()/)*&0"(%/*1#!"#$%&'()/)*&0"(2$1.342$",#5!"#$%&'()/)*&0"(2$1.340&&6 4%/1.$#$/1, 789:(((;5

!""#$%%&'((&)*+%,-&)*+%.//.0,-1+2(3,"4,(5)16(0/+7(.4%)1/",(89:;$.,<)5="4;)%;,;5+>;".,)"4;%$.5;"*"4;%+;14".%";1+2&/"?;4";3,.0/";,@/;@3"4)",

A#B==#$.,C+5"#'%$4+37$#,3&&+4%-#D:EFG#H%$"1$4),+,$+>I

A#J)74.%)+5,'#14".%"C%.0/"#,3&&+4%,#&4)2.4KC6"KC&4"<)?C%K&"-#DLMNL:#H,%3="5%O#%$"1$4),+,$+>I

A#B=="=#/+77)57#<+4#="&"5="51K#/+.=#"44+4,#>)%$#<)?%34",#DLLMFG#H,%3%$3/$3I

A#P)2"#Q+5"#.>.4"#.%%4)03%",#3,"#P)2"D)5C%)2"CQ+5"#HR"+<<#S3",)57I

A#T)?"=#%$.%#,1+&"=#U+)5,#>+3/=#5+%#./>.K,#0"#4",&"1%"=#DG98L#HP$"+4K(V.57"4I

A#W5,34"#%$.%#B1%)*"X"1+4=''Y./13/.%)+5,#=),.20)73.%",#<)"/=#5.2",#>)%$#%$"#%.0/"#5.2"-#DLLM8E#H1.*.//"I

A#B=="=#.==(4"2+*"C%)2",%.2&,#%+#%$"#,1$"2.#,%.%"2"5%,#<+4#.==)57#%$"#14".%"=C.%(3&=.%"=C.%#1+/325,#+5#"?),%)57%.0/",#DLLL8Z#HU4.2)4"QI

A#B=="=#B1%)*"X"1+4=''S.,"-<)5=['/.,%\#DLLNN9#H2)/++&,I

A#%",%C5.%)*"C%K&",#"?&"1%,#V.%"P)2"-/+1./C+<<,"%#)5,%".=#+<#V.%"P)2"-5+>-+<<,"%]#<)?",#%",%#04".6.7"#=3"#%+#=,%%4.5,)%)+5#HR"+<<#S3",)57I

A#B==#'4".=+5/K#+&%)+5#%+#^.,J.5KP$4+37$#.,,+1).%)+5,-#DLLLFG#H2)/++&,I

X30K#+5#X.)/,#8-L#;#_#@3"#$`#="#5+*+a

LM:

Page 105: Livro Ruby on Rails 2.1

!"#$%&'()"%)&*'&$+,-)"',"./,-012)3.-',2/4/',53.0/$/4"61)&/)5"78"5)0)-4/()08"9'/,/,:"/,"4;)"%&)<61)&8=">?@AB"C2+5/0BBDE

!"F)&*"*/G."H('/2"4;)"15)"'*",+$)2"70'-I"+&:1$),45="J0'5)5">KKKB?"C+28$'E

!"F'54:&)LMN."51%%'&4"5)&()&"()&5/',5"O=P"4;&'1:;"Q=B"+,2"4;)"&178<%:"2&/()&=">KKKRO"C92+(/5E

!"S,51&)"+55'-/+4/',"%&)0'+2/,:"2')5,T4"7&)+I"U;),"+,"+55'-/+4/',"&)41&,5",/0=">>KKKP@"CVWX0+5;E

!"W+I)"28,+$/-"*/,2)&5"&)5%)-4"4;)"./,-012)"',"Y+5W+,8Z;&'1:;"+55'-/+4/',5=">KB??Q="C-%84)0E

!"[+5)>/,54+,4/+4)\4/$)\'79)-4"',08"15)5"Z/$)=]',)"U;),"[+5)=4/$)\]',)\+U+&)\+44&/714)5"/5"4&1)^"0)()&+:)5Z/$)>4/$)\U/4;\2+4)4/$)\*+007+-I"*'&"&)+2+7/0/48"CV)'**"[1)5/,:E

!"_)*+-4'&"J',,)-4/',H2+%4)&5..J'01$,=,)U\4/$)."0)()&+:)"`+4)Z/$)"*+/0'()&"7);+(/'&"'*Z/$)>4/$)\U/4;\2+4)4/$)\*+007+-I"CV)'**"[1)5/,:E

!"#$%&'()"+55'-/+4/',5"%)&*'&$+,-)"78"15/,:"58$7'0"-+007+-I5"/,54)+2"'*"54&/,:"-+007+-I5=">KKKBQ"C+28$'E

!"a%4/$/5)"4;)"[/:`)-/$+0"-',()&5/',"-'2)=">KKKKB"C+28$'E

!"#,4&'21-)"4;)".&)+2',08"'%4/',"4'"+00"+55'-/+4/',5="_)-'&25"*&'$"4;)"+55'-/+4/',"-+,,'4"7)"5+()2=">KKBQP"C$/0''%5E

!"W104/%+&+$)4)&"+44&/714)5"*'&"4/$)"-'01$,5"*+/0"'()&"4'"`+4)Z/$)"U;),"'14"'*"&+,:)"'*"Z/$)"CV)'**"[1)5/,:E

!"[+5)>/,54+,4/+4)\4/$)\'79)-4"15)5"Z/$)=]',)=0'-+0bc"CV)'**"[1)5/,:E

!"H22"4/$)]',)<+U+&)"+44&/714)"&)+2)&5"+,2"U&/4)&5=">KB?QR"CV)'**"[1)5/,:E

!"#,54+,4/+4/,:"4/$)"'79)-45"/,"$104/%+&+$)4)&"+44&/714)5"15)5"Z/$)=]',)"/*"+(+/0+70)=">KB?QR"C&/-IE

J+%d410'"K@."JYHeVSNaV

KB@

Page 106: Livro Ruby on Rails 2.1

!"#$$"%&'(")*&+'",&-"#.'/0(1(.&2$334*5(20(2".6)55(5")2("/%/'/)6/7($"/%")"1)/65")889":;<=><"?@A%B

!"CDEFG3"&H/'"'(A'I*6&*"$(@)+6'5"@2&H"',("5.,(H)"/%5'()$"&@"+5/%J")%"(H8'D"5'2/%J9":;<=KL"?H$(/'(25B

!"*(6&%J5M'&"5+88&2'5"3$(8(%$(%'"NO"3$(5'2&D")%$"3$(6('(9":;<P=Q"?R&%)',)%"S/%(DB

!"T%'2&$+.("82(6&)$"U+(2D"5'2)'(JD"@&2"()J(2"3/%.6+$(59":=KV<"?W2($(2/.X"Y,(+%JZ"#6(X5(D"[&%$2)'(%X&Z".&$)@&&B

!"E+88&2'")JJ2(J)'/&%5"/%"@/%$(2".&%$/'/&%59":;<P\Q"?1D)%"[/%$(2H)%B

!"42J)%/7(")%$".6()%"+8"',("#.'/0("1(.&2$"'(5'"5+/'(9":;<\VQ"?R&,%"])2%(''(B

!"^%5+2("',)'"H&$/@D/%J",)5M)%$M*(6&%J5M'&MH)%D").'/&%5".6()2"',("U+(2D".).,(9"Y6&5(5":;<>V<"?_&,%9)%$2(-5B

!"W/A"/55+("-,(2("`)*6(:2(@(2(%.(5"$&(5%a'"8)55")"3%+66"&8'/&%"'&")"!M'D8(")''2/*+'("@&2"8&6DH&28,/.")55&./)'/&%59"Y6&5(5:;<\PL"?2)/65_/'5+B

!"W/A'+2(53"2(H&0($"5+88&2'"@&2"',(")%./(%'"82(bc#CG"@/6("@&2H)'9":;<\LK"?R&,%"])2%(''(B

!"C&2("',&2&+J,6D"U+&'("')*6("%)H(59":;<K=>"?$/H$(%/5Z"6&'5-,&6('/H(Z"R(2(HD"[(H8(2B

!"+8$)'(M)66"/J%&2(5"5.&8($"3&2$(2")%$"36/H/'Z"5&"8&5'9.&HH(%'59+8$)'(M)66"$&(5%a'"'2D"'&"/%.6+$("',(".&HH(%'"&2$(2"/%',("+8$)'("5')'(H(%'9":;<K>K"?]2(%$)%"1/*(2)B

!"#$$($"#.'/0(1(.&2$33])5(9.).,(MX(D"'&"H)X("/'"()5/(2"'&".).,("#.'/0("1(.&2$5"/%".&H*/%)'/&%"-/',"',("%(-#.'/0(E+88&2'33Y).,(33!"6/*2)2/(5"?deeB

!"C)X("5+2("YES"@/A'+2(5")2(".&H8)'/*6("-/',"2+*D";9=a5"%(-".50"/H86(H(%')'/&%9"?R^fQB

1+*D"&%"1)/65"Q9;"b"4"U+(",g"$("%&0&h

;<K

Page 107: Livro Ruby on Rails 2.1

!"#$$%$"&'"()*)+%,%*",-"./0*%+%/,1"$%0*%+%/,1")/$",2%.*"&)/3"4)*.%,.%5"5-"'-6"0)/"$-"(7)'%*89./0*%+%/,:;<(-./,51"=>?8@=AB"CD)+E

!"F(,.+.G%"#0,.4%H%0-*$<<I)5%?%J.5,5K",-"65%"?5%7%0,L)77"./5,%)$"-M"?M./$9"N7-5%5"?8@O@="CP)+%521"M02%6/31"(*-,-0--7E

!"Q-/R,"6//%0%55)*.7'"7-)$"2)5L+)/'")55-0.),.-/5"./")M,%*L6($),%"0)77&)0S59"N7-5%5"?OTBB"C5,-($*-()/$*%U1"0)/)$)$6)/%E

!"V)3%*"&%7-/35L,-"<./076$%"./M%*5",2%"M-*%.3/"S%'"M*-+",2%")55-0.),.-/"/)+%"*),2%*",2)/",2%"07)55"/)+%9"?8@=8W"CX-/),2)/Y./%'E

!"DZ[.,%<"M.J"*%/)+%L")/$"*%+-4%L0-76+/"M-*"0-76+/5"U.,2"6/.\6%"./$%J%59"?8@=WO"CI*)/$-/"]%%(%*5E

!"H6&'"89^"0-+(),.&.7.,'9"?8@O=="CX%*%+'"]%+(%*1"Q.*SP)/"I655./SE

!"#$%&'&()*'"&

B989@";_)'"`85,1"B@@T>!

!"a.J%$"*%5(-/5%"7-33./3",-"65%"7%/3,2"./5,%)$"-M",2%"%/,.*%",2./3";5%)/3%->"C?BWE

!"a.J%$",2),",-L()*)+"52-67$"&%"65%$")/$"2-/-*%$"./5,%)$"-M"2)*$0-$./3",2%".$"?88A@O"C35(.%*5E

!"b+(*-4%"$-06+%/,),.-/9"CH)$)*1"X)/"Q%"c--*,%*1"026'%-U1"J)4.%*52)'1"$)/3%*1"+.7--(51"d)4.%*"e-*.)1"D6//'"H.(%*,E

!"f5%"gV#Q"./5,%)$"-M"hVi"./"%J.5,5K"C&50-M.%7$E

!"a.J"5+)77"$-06+%/,),.-/",'(-9"N7-5%5"?8@OW@"C7936.$.E

N)(j,67-"8=<"Ng#ehV[Fh

8@W

Page 108: Livro Ruby on Rails 2.1

!"#$%&'()'*)+,-+')+.(/)*+'#()"0,%&1+."2(&/1+"%+.-$%34"567898":;,<$+)=

!">11(?".+--$%3">*-$<+@+.(/)*+AAB,.+5#()2,-"C+#()+"5.$-+4":)$*D=

!"E/FF()-",3%(.-$*"#()2,-."?0+%"*,11$%3"*/.-(2"2+-0(&.4"G1(.+."5678HI":J(+)$*0.+%=

!"K(*/2+%-"*/.-(2"2+-0(&.4"567ILM":G0+,0"G0/"N+(?=

!"@/CO"64M"*(2F,-$C$1$-O4":P+)+2O"Q+2F+)=

!"#$%&'())*+#

!"R$2+S(%+5-('.".0(?."(##.+-",."TUR"$%.-+,&"(#"VRGW"C+*,/.+"TUR"?$11"C+"2()+"#,2$1$,)"-("+%&"/.+)."X.++"-$2+"Y(%+.+1+*-."/.+&"CO"Z$%&(?."[EW"3((31+4*(2",%&"O,0((4*(24\"@+<+)-.":LH]7=":T+(##"B/+.$%3=

!"^,.04#)(2';21A"&,-+-$2+";21"-OF+."(<+)#1(?"-("@/CO"K,-+R$2+"*1,.."?0+%"(/-"(#"),%3+"(#"R$2+4">&&$%3"-+.-."#()"/-*(##.+-.":T+(##"B/+.$%3=

!"R$2+Z$-0S(%+"5_",%&"5`"A"+%./)+"(<+)#1(?"-("K,-+R$2+"?$-0"a/2+)$*",)3":T+(##"B/+.$%3=

!"R$2+5-('J.(%A"&(%b-"*(%<+)-"-("/-*"C+#()+"+%*(&$%34"@+#+)+%*+."56]I":T+(##"B/+.$%3=

!"@+2(<+"/%/.+&"PE[aAA@cEc@dcK'Z[@KEW"PE[a4<,1$&'$&+%-$#$+)e",%&"PE[a4)+.+)<+&'?()&e"2+-0(&.4"@+.(1<+."56894:G0+,0"G0/"N+(?=

!">&&$%3"K,-+4*/))+%-W"?0$*0")+-/)%."R$2+4Y(%+4-(&,O"$#"*(%#$34-$2+'Y(%+"$.".+-f"(-0+)?$.+")+-/)%."K,-+4-(&,O":T+(##B/+.$%3=

@/CO"(%"@,$1."g46"`"["h/+"0i"&+"%(<(e

67L

Page 109: Livro Ruby on Rails 2.1

!"#$%&'$()*+,&-"./(&"0/1("2&((&1"%&()+.3"456&/1"5%+,"5./6"&(78"/1&".&9$,&."+,"7:/33;",+":+,2&1"1&:6$,2"+,%&()+.<%$33$,2"=>&+99"?@&3$,2A

!"#$%&BC+,&B0/13&"1&(@1,",$:"9+1"3(1$,23"D$()",+"./(&"$,9+1%/($+,"=>&+99"?@&3$,2A

!"#$%&BC+,&B0/13&"1&30&7(3"+993&("$,9+1%/($+,"$,"3(1$,2B"E&3+:F&3"5GHIB"=J7+(("K:&7L&,3(&$,M">&+99"?@&3$,2A

!"N..&."E@O6"GBP"$%0:&%&,(/($+,"+9"Q1+7&33B./&%+,

!"R@1/($+,"53$,7&"/,."5/2+"D$()",+"/12@%&,("4&B2BM"IB./63B/2+8"1&(@1,"#$%&'$()*+,&"D)&,"7+,9$2B($%&<C+,&"$3"3&(BS,(1+.@7$,2"#$%&B7@11&,(M"D)$7)"1&(@1,3"#$%&BC+,&B,+D"$9"7+,9$2B($%&<C+,&"$3"3&(M"+()&1D$3&"T@3("1&(@1,3"#$%&B,+D"=>&+99?@&3$,2A

!"#$%&53$,7&"O&)/F&3"7+11&7(:6"D)&,"0/33&."/"R@1/($+,B"U:+3&3"5GGIVW"=L&%$::&1A

!"N.."52&(@(7"/:$/3"9+1"R/(&#$%&5@(7"=>&+99"?@&3$,2A

!"E&9/7(+1"#$%&'$()*+,&-".+,X("3&,."53$,7&M"5/2+M"5YM"5ZM"5/.F/,7&"()1+@2)"%&()+.<%$33$,2"=>&+99"?@&3$,2A

!"#$%&'$()*+,&"1&30&7(3"7+,9$2B/7($F&<3@00+1(B@3&<3(/,./1.<T3+,<($%&<9+1%/("=>&+99"?@&3$,2A

!"N.."7+,9$2B/7($F&<3@00+1(B&37/0&<)(%:<&,($($&3<$,<T3+,"(+"/::+D".$3/O:$,2"+9")(%:"&,($(6"&37/0$,2B"=1$7LA

!"S%01+F&".+7@%&,(/($+,B"=[/F$&1"\+1$/A

!"]+.$9$&."N7($F&J@00+1(--U/::O/7L3--U/::O/7L57/::"(+"/77&0("%@:($0:&"/12@%&,(3B

!"#$%&"56&3(&1./6"/,."5(+%+11+D"O&)/F&"7+11&7(:6"71+33$,2"RJ#"O+@,./16B"U:+3&3"5W^__"=3O:/7L3(+,&A

U/0`(@:+"GI-"UaN\>bcd>

GH_

Page 110: Livro Ruby on Rails 2.1

!"#$%&'$()*+,&-".//$,0"(&1(1"2+3"/1("4,/"5&46"/47"&/0&"841&1"9)&,"4/:4,8$,0"($%&";<&+22"=>&1$,0?

!"#$%&'$()*+,&@%&()+/A%$11$,0-"1&,/"(+">(8"(+"4/:4,8&"9$()"/1("8+33&8(,&11B"+()&39$1&"1&,/"(+"($%&C".//$,0"(&1(1"2+3($%&"8458>54($+,1"%&()+/1";<&+22"=>&1$,0?

!".//"8+,2$0C48($:&A1>66+3(C>1&A1(4,/43/AD1+,A($%&A2+3%4("1&(($,0"1+"()4("#$%&1"4,/"E4(&1"&F6+3("(+"GHI"JKLM"/4(&1C;3$8N?

!"#*G,2+-"O&%+:$,0">,,&&/&/"#$%&P+,&Q3+F7"85411";<&+22"=>&1$,0?

!"#*G,2+-"O&%+:$,0">,,&&/&/"#$%&P+,&G,/&FE&2$,$($+,B"1$,8&"9&R3&",+("$,85>/$,0"G,/&F&1--#$%&P+,&1";<&+22"=>&1$,0?

!"O&%+:$,0">,,&8&11437">1&1A(P$,2+")&56&3"23+%"(&1(1B"0$:&,"()4("#*G,2+"$1",+9"S>,/5&/";<&+22"=>&1$,0?

!"=>,/5$,0"4SS3&:$4(&/":&31$+,"+2"#*G,2+"0&%"LCTCJ-"+,57"()&"85411&1"4,/"P+,&"/&2$,$($+,1"3&U>$3&/"(+"1>66+3("O4$51"($%&P+,&"2&4(>3&1"43&"$,85>/&/C"G2"4"3&8&,(":&31$+,"+2"()&"2>55"#*G,2+"0&%"$1"$,1(455&/B"()$1"9$55"(4N&"63&8&/&,8&"+:&3"()&"S>,/5&/:&31$+,";<&+22"=>&1$,0?

!"#$%&'$()*+,&@%431)45A5+4/"/+&1"P+,&"5++N>6":$4"#$%&C0&(AP+,&B"1+"()4("(P$,2+VI51+,"$/&,($2$&31"43&")4,/5&/";<&+22=>&1$,0?

!"#$%&CP+,&W"488&6(1"#*G,2+--#$%&P+,&"$,1(4,8&1"4,/"I51+,"$/&,($2$&31X"93461"3&1>5("$,"#$%&*+,&"$,1(4,8&";<&+22=>&1$,0?

!"#$%&'$()*+,&"($%&"8+,:&31$+,1"/+,R(",&&/"(+"S&"93466&/"$,"#$%&I3E4(&#$%&B"S&84>1&"#*G,2+"/+&1"()$1"$,(&3,4557;<&+22"=>&1$,0?

!"#$%&'$()*+,&@>1&8"3&(>3,1"L"$,1(&4/"+2"&33+3"9)&,"E4(&#$%&"$1"93466&/";<&+22"=>&1$,0?

O>S7"+,"O4$51"YCM"Z"I"U>&")["/&",+:+\

MML

Page 111: Livro Ruby on Rails 2.1

!"#$%&'()"*'+,$)-./.0'-1"23/*/&4"5/-"6)"7''&.)&4"+8,9)':4";/(0)&<8/94"*/-=)&4"$0>''%<4"?/(0)&"@'&0/4"A,--9"30%)&.B

!"C-<,&)".8/."D0$)E0.8F'-)G.'H9/$>":'&I<":8)-"%/<<)*"/"JKLMNNC$0..)&1"2&0+IB

!"C-<,&)"+'&&)+."D0$)E0.8F'-)G.'H*/.)"2O)'PP"Q,)<0-=B

!"L/I)"D0$)E0.8F'-)":'&I":0.8".R0-P'"S1T1;N",<)"DF#-P'NND0$)R'-)GR'-)H0*)-.0P0)&"/>0/<"P'&"G/UU&)(0/.0'-4"<0>)-+):/&-0-=<"'-".)<.<1"3/0<)"M'/*C&&'&":8)-"DF#-P'"()&<0'-"0<"V"S1T"U9"<-0PP0-="P'&"DF#-P'NND0$)W&6/.)D0$)"+'-<./-.1"L'()/>>".R0-P'X*)%)-*)-."D0$)F'-)".)<.<"0-.'",<)<H.R0-P'"U>'+I"2O)'PP"Q,)<0-=B

!"D0$)4"6/.)D0$)"/-*"D0$)E0.8F'-)"G0-H.0$)HR'-)"*)P/,>.<".'"D0$)1R'-)1"3)$'(0-="-':",--))*)*G0-H+,&&)-.H.0$)HR'-)"2O)'PP"Q,)<0-=B

!"DF#-P'"+/+8)<"D0$)R'-)"0-<./-+)<"0-"0.<"':-"0-.)&-/>"8/<8"+/+8)4"<'"D0$)F'-)NNLK77#@O"*')<-Y."-))*".'"+/+8)".8)$/<":)>>"2O)'PP"Q,)<0-=B

!"K**0-="D0$)F'-)G%/&<)"2O)'PP"Q,)<0-=B

!"K**0-="D0$)F'-)G/."/-*"6/.)D0$)G.'HP"2O)'PP"Q,)<0-=B

!"D0$)E0.8F'-)"&)<%'-*<".'"3,U9"Z1[":))I*/9X-/$)*"\,)&9"$).8'*<"2O)'PP"Q,)<0-=B

!"D0$)E0.8F'-)"+/+8)<"DF#-P'NND0$)R'-)7)&0'*",<)*"P'&".0$)"+'-()&<0'-"<'".8/."0."+/-"U)"&),<)*4"/-*")-P'&+)<"6AD&,>)<"+'&&)+.>9":8)-"0-<./-+)"0<"+&)/.)*"P&'$"/">'+/>".0$)"2O)'PP"Q,)<0-=B

!"]0;)*".8/."Q,PP)&)*M'==)&"<8',>*"+&)/.)"0.<"':-"*0&)+.'&9"0P"'-)"*')<-Y."/>&)/*9");0<."GZZT^_"2>'.<:8'>).0$)B

`/%a.,>'"Z_N"`bK@OCMWO

ZZZ

Page 112: Livro Ruby on Rails 2.1

!"#$%"&'()*$+",$()",)-,-".*/0)1".2"345"+6718)".2"71+6/*$18",6)(",/"9$%):",$()-"$1-,)7:"/9"5$();1/<;"=1+6/*5$()>/1)?1/<"345",)-,",/",$()"-@)+$9$):"<$,6"5$();7,"$1-,)7:"/9"5$();A/+7A",/"</*0"7*/'1:"@A7,9/*(":$99)*)1+)-"<$,65$();A/+7A"71:"345"*)@*)-)1,7,$/1"BC)/99"D')-$18E

!"F)(/G$18"'11)):):"?+6718)H,$()HI/1)"(),6/:"9*/("5$()J"37,)5$()"71:"5$()K$,6>/1)"BC)/99"D')-$18E

!"5$()>/1)"?A/+7A"71:"?1/<"+/**)+,A2")19/*+)"345"*'A)-"BC)/99"D')-$18E

!"5$()K$,6>/1)"$1-,71+)-"+/**)+,A2")19/*+)"345"*'A)-;"=::$18"5$()>/1)?@)*$/:H9/*H',+"BC)/99"D')-$18E

!",)-,H,$()H<$,6H:7,),$()H97AA.7+0")%@)+,-"37,)5$();A/+7AH/99-),"$1-,)7:"/9"37,)5$();1/<;/99-),"BC)/99"D')-$18E

!"=::$18"5$()K$,6>/1)"?(7*-67AH:'(@"71:"?(7*-67AHA/7:"BC)/99"D')-$18E

!"=::"L*:)*):M7-6?,/H67-6"BN/-6E

!"=::$18"5$()?)1:H/9H:72J"HO'7*,)*J"H<))0J"71:"H2)7*;"?PQRS"BT'71N/"D7I71J"57*(/"5U17GJ"D$85$,'-E

!"=::$18"5$()K$,6>/1)?.),<))1V"BC)/99"D')-$18E

!"5$();WWW"*),'*1-",*')"9/*"5$()K$,6>/1)"$1-,71+)-"BC)/99"D')-$18E

!"5$()K$,6>/1)"?X"71:"?Y".)67G)"+/1-$-,)1,A2"<$,6"1'()*$+"7*8'()1,-"*)87*:A)--"/9"<6),6)*"<*7@@):",$()"$-"7"5$()"/*37,)5$()Z"+/1-$-,)1,2"71-<)*-"97A-)",/"?7+,-HA$0)V[\:7,)]"BC)/99"D')-$18E

!"=::"4,*$18?-O'$-6"71:"4,*$18?-O'$-6^",/"*)(/G)"+/1-)+',$G)"+6'10-"/9"<6$,)-@7+);"?RRRSQ"BN/*:$J"M)1*$0"&E

!"4)*$7A$I)"D$83)+$(7A-"7-"#A/7,-"<6)1"'-$18",/H27(A;"?_`ab"B)*1)-,/;N$()1)IE

F'.2"/1"F7$A-"S;R"Y"L"O')"6c":)"1/G/V

RRS

Page 113: Livro Ruby on Rails 2.1

!"#$$%&'"(%)*+%,-./&*"0,/123)45"0,/1$3,*,%)*5"0*647"3&$")*,-/$"34%38*8"9/:"$;<=>,2?%&'"</)?3,%@%4%,2"A%,-"(%)*BC*/99"D;*8%&'E

!"(%)*+%,-./&*"0%&1,%)*1F/&*":*,;:&8"G8*49G"%9"F/&*"3:';)*&,"%8",-*"83)*"38"0,%)*1F/&*"BC*/99"D;*8%&'E

!"#$$%&'"(%)*+%,-./&*"0,/135"0,/195"0,/1%5"0-,,?$3,*5"0:9<HIHH"BC*/99"D;*8%&'E

!"J:;&%&'";&&**$*$"(%)*+%,-./&*0<-3&'*1,%)*1F/&*1,/1<;::*&,"BC*/99"D;*8%&'E

!"(%)*0F/&*K5"0%&1,%)*1F/&*"3&$"0<-3&'*1,%)*1F/&*"3<<*?,"3"L;:3,%/&"BC*/99"D;*8%&'E

!"(%)*0%&1,%)*1F/&*"-3&$4*8"(%)*M4/<34"%&8,3&<*8"</::*<,42"BC*/99"D;*8%&'E

!"J:;&%&'";&&**$*$"(%)*0<-3&'*1,%)*1F/&*1,/1<;::*&,M"N&-3&<*$"$/<8",/"0<-3&'*1,%)*1F/&*",/"*O?43%&",-*"$%99*:*&<*@*,A**&",-%8")*,-/$"3&$"0%&1,%)*1F/&*"BC*/99"D;*8%&'E

!"(%)*./&*0&*A")*,-/$":*&3)*$"04/<34P"A-*&";8*$"A%,-"(%)*MF/&*5"</&8,:;<,/:"&/A":*3$8Q"(%)*MF/&*M4/<34RS"BC*/99D;*8%&'E

!"#$$*$"D38*TUM*&</$*TU8",/"*&</$*"V34;*8"%&"@38*TU"A%,-/;,",-*"&*A4%&*8M"(-%8")3=*8",-*"V34;*8"%))*$%3,*42";83@4*"38WXY"?3:3)*,*:8"/:")*)<3<-*"=*28"A%,-/;,"9;:,-*:"?:/<*88%&'"BLZZE

!"X*)/V*"Q&/$/<Q"*&,:%*8"3:/;&$",-*"#<,%V*[;??/:,",*8,\;&%,"388*:,%/&8M"0]^_UT"B$3&<:/3=5"`3)*8-E

!"#$$"(%)*MF/&*1$*93;4,"3<<*88/:"9/:"8*,,%&'",-*"$*93;4,",%)*"F/&*M"X3%48QQa/&9%';:3,%/&M,%)*1F/&*"8*,8",-%8M"0]^_IHBC*/99"D;*8%&'E

!"<3<-*M9*,<-R=*25"Q9/:<*"Kb",:;*S",/"9/:<*"3"<3<-*")%88M"Bc*:*)2"d*)?*:E

a3?e,;4/"]fQ"aZ#gCNYhC

]]i

Page 114: Livro Ruby on Rails 2.1

!"#$%%&'("')('*)+*,-".*/)0&,)1"2*(3"4"5$'4(*&,6".*/)0&,)789::;;<"==".*/)0&,)78>:;6/*,$()1<6"7'*?@<

!".*/)A*(30&,)B8"4CC)CD"1&"(34("B8"?4,"34,CE)"4".*/)"&'".*/)A*(30&,)"4'-$/),("?&'')?(EF"7G)&HH"I$)1*,-<

!"2*(3J(*/)K&,)"()1("3)E%)'"'),4/)C"2*(3J),+J(KD"(&"C*1(*,-$*13"L)(2)),"1)((*,-"MNO7P.0P<"4,C"1)((*,-".*/)6K&,)"*,"()1(17G)&HH"I$)1*,-<

!".*/)B8"?&)'?)1".*/)A*(30&,)"4'-$/),("(&"4".*/)"*,1(4,?)"1&"(34("C*HH)'),?)"*,"1)?&,C1"?4,"L)"?4E?$E4()C6"QE&1)1BR;SR>"7G)&HH"I$)1*,-D"FFF?TR><

!"UCC*,-"V.Q"K&,)"(&".*/)0&,)W".*/)A*(30&,)",&"E&,-)'"341"(&"H4@)"V.Q"K&,)"2*(3",*E"7G)&HH"I$)1*,-<

!".*/)6-)(JK&,)"')H4?(&')C"(&"%'*+4()"/)(3&CD"-*+),"(34("(3)"),?4%1$E4()C"E&-*?"*1"&,EF"$1)H$E"*,()',4EEF"7G)&HH"I$)1*,-<

!".*/)6K&,)"$1)1"(3')4C8E&?4E"+4'*4LE)"H&'"(3')4C"14H)(F6"UCC*,-".*/)6$1)JK&,)D"H&'"&+)''*C*,-".*/)6K&,)"E&?4EEF"*,1*C)"4LE&?@6"X)/&+*,-"$,,))C)C".*/)6K&,)J')1)(Y"7G)&HH"I$)1*,-<

!".*/)0&,)B(&J1"$1)1"V.Q"'4(3)'"(34,"GZ.W"')4%%EF*,-"?34,-)"(34("241"$,C&,)"*,"7:[\S<6"BR[:S"7Q3)43"Q3$"])&2<

!".*/)6C4F1J*,J/&,(3"C)H4$E(1"(&"?$''),("F)4'"*H",&"F)4'"*1"1$%%E*)C"41"4'-$/),("BR;\SS"7X4C4'<D"$1)154()6-')-&'*4,JE)4%^"(&"C)()'/*,)"E)4%"F)4'D"4,C"$1)1"?&,1(4,("E&&@$%"(&"C)()'/*,)"C4F1"*,"/&,(3"7G)&HH"I$)1*,-<

!"UCC*,-".*/)"4,C"54().*/)"B?&/%4')J2*(3J?&)'?*&,D"23*?3"E4F)'1"L)34+*&'"&,"B_=`"1&"(34("4,F"?&/L*,4(*&,"&H".*/)D54().*/)"4,C"U?(*+)#$%%&'(aa.*/)A*(30&,)"*,1(4,?)1"?4,"L)"?3'&,&E&-*?4EEF"?&/%4')C"7G)&HH"I$)1*,-<

!".*/)0&,)B,&2"')($',1"4,"U?(*+)#$%%&'(aa.*/)A*(30&,)"7G)&HH"I$)1*,-<

!".*/)"B*,J?$''),(J(*/)JK&,)"4,C"B?34,-)J(*/)JK&,)J(&J?$''),("')($',"1)EH"23),".*/)6K&,)"*1",*E"7G)&HH"I$)1*,-<

X$LF"&,"X4*E1"96R"8"b"c$)"3d"C)",&+&^

RR>

Page 115: Livro Ruby on Rails 2.1

!"#$%&'$"())$$*$*"+,&-*.,$,/%$-*$0.(1,-2".1/.2"0&3"4.,$5/%$+,&-26"7/'$)",8.,"9$"/)8$3/,"."+,&-*$0.(1,-2"03&%"4.,$,8.,"*&$2"$:.;,1<",8$"2.%$",8/)7"=>$&00"?($2/)7@

!"#$0.;,&3"5/%$".)*"4.,$5/%$"+,&-0&3%.,,$*-2A"(2$",$3).3<"/)2,$.*"&0")$2,$*"/0B$12$"=>$&00"?($2/)7@

!"C**/)7"5/%$".)*"4.,$5/%$"+0&3%.,,$*-&002$,6"0&3"&(,D(,,/)7"EFFAGG"(,;"&002$,"2,3/)72"9/,8";3&22HD1.,0&3%;&)2/2,$);<"=>$&00"?($2/)7@

!"C**/)7".1,$3).,$-(,;-2,3/)7"&D,/&)",&"5/%$I&)$+0&3%.,,$*-&002$,J"#$%&'/)7"())$$*$*"5/%$I&)$+&002$,J"=>$&00?($2/)7@

!"K),3&*(;$"C;,/'$L(DD&3,AA5/%$M/,8I&)$6"0&3"93.DD/)7"5/%$"/)2,.);$2"9/,8"."5/%$I&)$J"K),3&*(;$"/)2,.);$"%$,8&*2",&5/%$"0&3";3$.,/)7"5/%$M/,8I&)$"/)2,.);$26".)*";1.22"%$,8&*2"0&3"%.).7/)7"."71&N.1",/%$"O&)$J"=>$&00"?($2/)7@

!"#$D1.;$")&)H*2,H.9.3$"5/%$I&)$";1.22"9/,8"*2,H.9.3$";1.22"03&%",O/)0&-,/%$O&)$"D1(7/)J"5/%$I&)$+.*P(2,".)*+().*P(2,".3$")&"1&)7$3".'./1.N1$Q",O/)0&"7$%"%(2,")&9"N$"D3$2$),"/)"&3*$3",&"D$30&3%",/%$"O&)$";.1;(1.,/&)26"'/.+1&;.1-,&-(,;".)*"+(,;-,&-1&;.1"%$,8&*2J"=>$&00"?($2/)7@

!"R:,3.;,"C;,/'$L(DD&3,AAS.11N.;T2"03&%"C;,/'$"#$;&3*6",$2,";.2$"2$,(D".)*",$.3*&9)6".)*"C;,/&)S&),3&11$3AA4/2D.,;8$3J+UVWXW"=Y&28"Z$$T@

!"K),3&*(;/)7"4.,$5/%$"+(,;6"+(,;[".)*"+(,;-&002$,6"0&3"*(;TH,<D/)7";&%D.,/N/1/,<"9/,8"5/%$J"S1&2$2"+UVVVX"=>$&00?($2/)7@

!"5/%$+,&-P2&)"(2$2"\(%$3/;+,&-(,;-&002$,-2",&"&(,D(,".";3&22HD1.,0&3%H;&)2/2,$),"3$D3$2$),.,/&)"9/,8&(,"8.'/)7",&;&)'$3,",&"4.,$5/%$J"#$0$3$);$2"+]W^V"=>$&00"?($2/)7@

S.D_,(1&"U^A"SFC\>R`a>

UU^

Page 116: Livro Ruby on Rails 2.1

!"#$%&'()*"+,-.$*/()/00122/3(*4+5"')+6$*34)+"7)54'"%*)-"84-$9)+$:%)*-&(($;<)%%3$("()"&"*$,3&.7$=,-$*4':()<,('<)%%3$(<3"-$(>);?"@A$)%%"B,$34+5C

!"D)+(4+,$"$6)7,(4)+"()E&*;"F'(46$G,HH)*(118$3(D&3$?":IJKLM"@N)3>"O$$PC

!"8$3(D&3$1"4+(*);,'$";$'7&*$;"3$(,H"&+;"($&*;)E+"'&77.&'P3?"O&33"&"743(")%"-$(>);3"&+;"&+")H(4)+&7".7)'P"()"'&77".$%)*$3$(,H")*"&%($*"($&*;)E+?"G$(,H"'&77.&'P3"&*$"*,+"4+"(>$")*;$*";$'7&*$;Q"($&*;)E+"'&77.&'P3"&*$"*,+"4+"*$6$*3$?"@N$*$-RS$-H$*C

!"F;;$;"F'(46$G,HH)*(11AT4H?;$')-H*$33U')-H*$33V3),*'$W"&3"&+"$&3R"E*&HH$*"%)*"974."@8).4&3"X,$(P$C

!"Y+'7,;$;"2$-D&'>$/D74$+("()"-&P$"(>$"4-H*)6$;"F'(46$G,HH)*(11D&'>$112$-D&'>$G()*$"E)*P"),(")%"(>$".)Z"@B).D)((*$77["\*4'"0);$7C

!"F;;$;"F'(46$G,HH)*(11D&'>$11!"%*&-$E)*P"&3"&+"$Z(*&'(4)+"%*)-"F'(4)+D)+(*)77$*11D&'>4+511]*&5-$+(311!"@^00C

!"]4Z$;"G(*4+5:(4(7$4T$"()"E)*P"%)*"3(*4+53"E4(>"_3"())":IJ`LI"@(*$PC

!"D>&+5$;"(>$"4-H7$-$+(&(4)+")%"\+,-$*&.7$:5*),H<.R"()",3$"&";),.7$"&**&R"&HH*)&'>"4+3($&;")%"&">&3>"3,'>"(>&("(>$4+3$*(")*;$*"43">)+)*$;"@^00U2&*'$7C

!"*$-)6$"-,7(4H7$"$+,-$*&(4)+3"%*)-"F'(46$G,HH)*(11NGa=:')+6$*(<b3)+<()<R&-7"E>$+";$&74+5"E4(>";&($U(4-$"6&7,$3?@*4'PC

!"0&3>:3R-.)74T$<P$R3"3P4H3"P$R3"(>&("'&+_(".$"3R-.)74T$;?":IJ`JJ"@B*&;"A*$$+7$$C

!"#,.R"I?M"')-H&(4.474(R?":IKcM[":IJdKK[":IJdKc[":IJ``d[":IJ`Md[":IJKef"@D>$&>"D>,"g$)E["O*&(4P"=&4P["N$*$-RS$-H$*["^4*Pb&+"B,334+P["%Z+C

#,.R")+"#&473"f?I"/"a"h,$">i";$"+)6)j

IIK

Page 117: Livro Ruby on Rails 2.1

!"#$%&'()&*+(,-".-&-"/#0"12+3&1"+32)"45#6"*789:";03&23"03."<&(=>

!"?&@2A+(1"(@"B2-3*-C%D(E$F&,G&C-H"+(".-&"B2-3*1&IE2A&6"0E(-&-"*7JKLJ";?&$)B>

!"M$N"B2-3O$+3P)Q$@@&1&)+RAA&--*+(,(I+$()-H"-("$+"Q(&-)S+"AE&21"+3&"(I+$()-"32-36"0E(-&-"*7JK7:";?&$)B>

!"#$%#&'

!"-A1$I+TQDA()-(E&"@$1&-".I"+3&"A(%%2)QUE$)&"Q2+2D2-&"AE$&)+6"*7JL";V+&W&"X.1A&EE>

!"M$N"D.Y"=3&1&"IE.Y$)"$)$+61D"@$E&-"@1(%"@1(F&)"Y&%"-I&A-"=&1&)S+"D&$)Y"1.)6"ZI[D\]";*7LL"-+2+&^1&-(EW&Q>

!"52Q&"+3&"E(A2+$()"(@"+3&"1(.+&-"@$E&"A()@$Y.12DE&"=$+3"A()@$Y61(.+&-,A()@$Y.12+$(),@$E&"ZVA(++"ME&AG&)-+&$)]";*99>

!"?2$E-"_QY&"$)@("1&+.1)-"+3&"E2+&-+"Y$+"A(%%$+"32-3";M12)A&-A"_-IE.Y2->

!"RQQ&Q"?2$E-6I.DE$A,I2+3"+("A()+1(E"=3&1&"B#5`"2)Q"2--&+-"21&"&NI&A+&Q"+("D&"E(2Q&Q"@1(%"ZQ&@2.E+-"+("?2$E-61((+"abTI.DE$Ab]"*77c97";)$AG-$&Y&1>

!"12G&"+$%&^F()&-^E(A2E"@$)Q-"A(11&A+"D2-&".+A"(@@-&+"@(1"F()&-"$)"+3&"V(.+3&1)"B&%$-I3&1&";4&(@@"d.&-$)Y>

!"e()S+"1&f.$1&"12$E-TY&%,D.$EQ&1"Q.1$)Y"12$E-"$)$+$2E$F2+$()g"$+S-"()EC")&&Q&Q"@(1"+3&"Y&%-^D.$EQ"+2-G6";1$AG>

!"-A1$I+TI&1@(1%2)A&TI1(@$E&1"A(%I2+$D$E$+C"=$+3"+3&"1.DCUI1(@"hi"J6c6J6"0E(-&-"*:7j86";02+@$-3>

!"ME&-3"(.+"12G&"Y&%-^.)I2AG"+(".)I2AG"2EE"Y&%-g"2)Q"2QQ"12G&"Y&%-^D.$EQ"@(1")2+$W&"&N+&)-$()-6"*77c7\";QQ(EE21>

02Ik+.E("7c^"0BRl4_`m4

77j

Page 118: Livro Ruby on Rails 2.1

!"#$%&$'()*+,"-# ! "#$%&'()%**)+,-(!"#$%&$'()*+,"-# ./01'2&$' ! "#$%&'().#*/)01,)+,-)2-/+,-2

!"#$%&$'()3*456 ! 3"4*5()%**)"#$%&',5)+,-(!"#$%&$'()3*456 ./01'2&$' ! 3"4*5().#*/)01,)+,-)2-/+,-2

!"#$$"%&'()*+,%-)./01233&4-"(&4"(2-24/"%&'()*24,-)&'"&3-)&'1+"#51&6",$$"7&4/"'/8"9,)51":"%&'()*"1/--)'*1"-&'/804,)510$/(,25-1+4;"<4)%=>

!"#$$"9,)51+5&**/46"9,)51+4&&-6"9,)51+/'.",'$"9,)51+%,%?/"1?&4-%2-1"(&4"9#@AB0!"%&'1-,'-1"<34,-)=>

!"#55&8"()5/1")'"352*)'1"-&";/"4/5&,$/$"5)=/"-?/"4/1-"&("-?/",335)%,-)&'+"<4)%=>

C',;5/1"&4"$)1,;5/1"352*)'"4/5&,$)'*+

-7+84&9!$57"6:;,5*&4+( 1 <!*$

D&2"%,'"*/-",4&2'$"-?)1"1/--)'*"3/4"352*)'+

@("E4/5&,$0352*)'1F"GG"(,51/"HICJ#KALM6",$$"-?)1"-&"N&24"352*)'O1")')-+4;"-&"7,=/")-"4/5&,$,;5/P

=$,$+6$+-4$(957"6;7+-$;,"<>(96$5$<$ 543:;,"<>

@("E4/5&,$0352*)'1F"GG"-42/6",$$"-?)1"-&"N&24"352*)'O1")')-+4;"-&"&'5N"5&,$")-"&'%/P

=$,$+6$+-4$(957"6;7+-$;,"<>( ?? 543;,"<>

!"B7,55"-8/,="-&",55&8"352*)'1"-&"13/%)(N"*/7"$/3/'$/'%)/1+"<4)%=>

! 678).$,#9:459:%"01,#04&%04.#)$*"+4#)4#40;<3!$@*4!$ A2"64(A

92;N"&'"9,)51"Q+R"S"T"U2/"?V"$/"'&.&F

RRW

Page 119: Livro Ruby on Rails 2.1

!"#$%!" &'(")%*&+,-%').')-!'//"!00123"43")* 0%),/$*"5 6(")7*+$-8")-%,2-%')

! "#$,')9%:4:"; <!$=>?'(")%*<5 0/%= @A <'(")%*<5 0B"!3%') @A <C4C4D<,')9%:4:"; <!$=>?>2*%3<5 0/%= @A <>2*%3<5 0B"!3%') @A <E4F4D<

,')9%:429-"!G%)%-%2/%H" *'+,-%').')-!'//"!00123"43")* 0%),/$*"5 6(")7*+$-8")-%,2-%')

")*

!"#$$%$"&'()*+,+%-")'."/0%&*)1*(+"23*&3"+%-/"4.%".%56*.%$"71"83%"4009*&48*'(:"4/"2%99"4/".4;%"84/;/")'."*(/8499*(+"4($).%%<*(+"+%-/,"=.*&;>

I2%/3007)%-%2/%H"!4!$) *' J,')9%:J,')9%:4:"; <=K<,')9%:4:"; <8(!%,'-<5 0B"!3%') @A &E4L&5 03'$!," @A <8--(0MM,'*"4N8>-8"/$,O>3-%994)"-<,')9%:4:"; <2N3?3F<5 0/%= @A <2N3M3F<

")*

! %&'()*+,-&*+.)/+0'1!2O"P:";3

! 23'(455)455)*+,-&*+.)/+0'6!2O"P:";30%)3-2//

! 73849:)'8+9&;&+.)/+0)(<)=+3.<*>/+0'>/+0?@340+AB1B1B!2O"P:";30$)(2,O QRS@=K

!"?%-'@%$"83%"$%)4698",384&&%//"&'()*+6.48*'("4/"83%.%"4.%"/'"-4(1"+''$"$%09'1-%(8"'08*'(/"('2"A;%08"*8"4/"4("%B4-09%*("?C#DECF"=DGG>

!"&'()*+,8*-%H<'(%"4&&%08/"IJK()'LLI*-%<'(%"*$%(8*)*%./"4/"2%99"4/"?4*9/"I*-%J'(%"*$%(8*)*%./"=M%'))"N6%/*(+>

O40P869'"QRL"OG#SMCTUM

QQV

Page 120: Livro Ruby on Rails 2.1

!"#$%&'(()*%+%$&%,-./%*%+%$&%,-0+%1-0,2*-".$%'-'"$*"-..2."%3"4$&5-"$''%6*-7"+2"82*3%69+%1-0,2*-"%'"*2+".-826*%,-79"#$:-"+%1-,2*-"+$':'"2*&;".-<5%.-"=8+%4->5??2.+"%*'+-$7"23"-*+%.-"-*4%.2*1-*+"@A-233"B5-'%*6C

!">+2?"$77%*6"+D-"$*+%<5$+-7"+-'+E128:'E!"7%.-8+2.%-'"$*7"2*&;"$77"+D-1"+2"+D-"?$+D"%3"+D-;F.-"'+%&&"+D-.-"32."&-6$8;".-$'2*'@GHHC

!"=77-7"+D$+"6-1'"8$*"*2I"J-"?&56%*'"%3"+D-;"%*8&57-".$%&'E%*%+9.J"/KKLLL"@MJ$.*-++-C

!"=77-7"N&56%*/$J25+"1-+D27"+2"?.26.$11$+%8$&&;"$88-''"+D-"$J25+9;1&"%*"$"?&56%*"/KOPQP"@&$,;$+21C

!"#$%& ' ()%"*++,"#$%&-&./0!)123415346734!"#$%&8!"#$%&-)95#1:;)#125<;= ! "#$%&'()*$+,'(%!"#$%&-)95#1:;#<";= ! "#$%-../01123.)456'-73).%

!")1?.24-"72851-*+$+%2*9"@#$7$.R"S$*"G-"N22.+-.R"8D5;-2IR"T$4%-.'D$;R"7$*6-.R"1%&22?'R"U$4%-."V2.%$R">5**;"#%?-.+C

!"=77-7"82*3%69+%1-0,2*-"W"FXYZF"%*"+D-"7-3$5&+"-*4%.2*1-*+9.J"@A-233"B5-'%*6C

!"=77-7".$:-"+$':'"+%1-(,2*-'($&&R"+%1-(,2*-'(5'"$*7"+%1-(,2*-'(&28$&"32."3%*7%*6"+%1-",2*-"*$1-'"32."82*3%69+%1-0,2*-2?+%2*"@A-233"B5-'%*6C

!"=77"82*3%69+%1-0,2*-"32."82*3%65.%*6"+D-"7-3$5&+"Y%1-9,2*-"4$&5-9"/KOP[\"@A-233"B5-'%*6C

!"=77-7"'5??2.+"32."%*'+$&&%*6"?&56%*'"D2'+-7"$+"6%+".-?2'%+2.%-'"/KK\PL"@7$*6-.C

!"]%T-7"+D$+"'8.%?+E6-*-.$+-"I25&7"*2+"&22:"32."?&56%*"6-*-.$+2.'"%*"?&56%*0?$+D'"/KKOOO"@6&4C

!"]%T-7"7$+$J$'-".$:-"+$':'"+2"I2.:"I%+D"8D$.'-+E82&&$+%2*"$*7"'D2I"?.2?-."-..2."1-''$6-'"2*"3$%&5.-9"Z&2'-'"/KK^OK@1$++C

#5J;"2*"#$%&'"\9K"_"`"<5-"Da"7-"*242b

K\O

Page 121: Livro Ruby on Rails 2.1

!"#$$%$"&"'%(''%)*+,-"-+"./,0*-(*12304"04.-&115"2.%.".64"%)*+,-7"89:;<=">?+4@A1&4B*&$74%-CD

!"E%.F2GG1%"1+&$"+,$%,".+"-F&-",+2-%."&4$"+A.%,6%,."&,%"040-0&10H%$"&G-%,"*12304."&4$"&**"040-0&10H%,.7"I1+.%."89:J;:">,0/BD

!"K0-".2**+,-"G+,"./,0*-(3%4%,&-%7"89:LJ:">..+,+B&D

!"M*$&-%"./&GG+1$"-+"2.%"1&A%1."04.-%&$"+G"A+1$"-&3.7"I1+.%."89:=N=">H&/F'04310.'1-OD

!"E%.2,,%/-"P+,$Q%-".R4+4RS"1++B2*.7"89:=9:">-+S7(5"S&--D

!"#$$%$"/+4G037/&/F%T.-+,%"-+"%460,+4S%4-"+*-0+4."-+"/+4-,+1"-F%"$%G&21-"/&/F%".-+,%"U$%G&21-"0."V01%W-+,%"0G"-S*(/&/F%"0.*,%.%4-5"+-F%,X0.%"Y%S+,RW-+,%"0."2.%$C">Z[[D

!"#$$%$"-F&-",&01.\2*$&-%"0.",24"XF%4"R+2"$+",&01.\G,%%H%\%$3%"-+"%4.2,%"R+2"&1.+"3%-"-F%"1&-%.-"]W"&4$"/+4G03"G01%."89:NLN>?%GGD

!"W^_0-%\"$A\$,+*\&11"$+%.4`-"G&01".01%4-1R"0G"-F%"$&-&A&.%"0."&1,%&$R"+*%47"89:N==">IF%&F"IF2"a%+X5"S,0/FS&4D

!"b4-,+$2/%"4&-06%"S+43,%1"F&4$1%,"&4$"*2.F"S2-%)"04-+"$0.*&-/F%,7">]%,%SR"c%S*%,D

!"E2AR"97J"/+S*&-0A010-R7"89L;J5"89:N<L">IF%&F"IF2"a%+X5"G,%$%,0/+D

I&*d-21+"9N\"I[#QKe_fK

9g9

Page 122: Livro Ruby on Rails 2.1

!"#$%&'%!()*+%,-.%/%0%1"2%34%52%'&6&7

.,,

Page 123: Livro Ruby on Rails 2.1

!"#$%&'()*+,)!-./01230

*45

Page 124: Livro Ruby on Rails 2.1

!"#$%&'%!()*+%,-.%/%0%1"2%34%52%'&6&7

.,8