Table Of Content© 2012,CasadoCódigo
TodososdireitosreservadoseprotegidospelaLeinº9.610,de10/02/1998.
Nenhumapartedestelivropoderáserreproduzida,nemtransmitida,semauto-
rizaçãopréviaporescritodaeditora,sejamquaisforemosmeios: fotográficos,
eletrônicos,mecânicos,gravaçãoouquaisqueroutros.
CasadoCódigo
Livrosparaoprogramador
RuaVergueiro,3185-8ºandar
04101-300–VilaMariana–SãoPaulo–SP–Brasil
CasadoCódigo
Agradecimentos
Monstersarereal,andghostsarerealtoo.Theyliveinsideus,andsometimes,they
win.
–StephenKing
Este livro não existiria sem a ajuda dos meus grandes amigos Matheus Bodo,
Willian Molinari, Sérgio Schezar e Vinícius Uzêda, que me acompanharam nesse
processo quase todos os dias, revisando, criticando e opinando minuciosamente o
conteúdodesselivro.Muitoobrigado!
MuitoobrigadotambémafamíliaCasadoCódigoeCaelum,pelaoportunidade
deescreveresselivroepelosensinamentos,especialmenteaoAdrianoAlmeida,pelo
difíciltrabalhodecolocarordemàsminhaspalavras.
Agradecimentos especiais também ao GURU-SP (Grupo de Usuários Ruby de
São Paulo), à PlataformaTec e aos amigos do ICMC-USP, pois se sei alguma coisa,
devotudoaeles.
Agradeço também a minha família e amigos, pela força e por tolerarem meses
semnotíciasenquantomemudoparaoutropaís.
Porfim,agradeçoprincipalmenteavocêleitor,porinvestirseutempoaaprender
umatecnologiaqueeupessoalmentegostotanto.Esperosinceramentequesejauma
jornadadivertidaelucrativaaomesmotempo!
i
CasadoCódigo Sumário
Sumário
1 Introdução 1
1.1 Paraqueméestelivro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Organização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
AlinguagemRuby 5
2 ConhecendoRuby 7
2.1 InstalaçãodoRubyeRails . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 PrimeirospassoscomRuby . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Tiposeestruturadedados . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4 Fluxoselaços . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5 Funções,blocos,lambdaseclosure . . . . . . . . . . . . . . . . . . . . 39
2.6 Classesemódulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.7 BibliotecaseRubyGems. . . . . . . . . . . . . . . . . . . . . . . . . . . 67
2.8 Fim! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
RubyonRails 71
3 Conhecendoaaplicação 73
3.1 Arquiteturadeaplicaçõesweb . . . . . . . . . . . . . . . . . . . . . . . 74
3.2 Recursosaoinvésdepáginas . . . . . . . . . . . . . . . . . . . . . . . . 74
3.3 RecursosnoColcho.net . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.4 Conhecendooscomponentes . . . . . . . . . . . . . . . . . . . . . . . 76
3.5 Osmodelos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
iii
Sumário CasadoCódigo
3.6 Controle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.7 Apresentação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.8 Rotas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.9 Suporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
3.10 Consideraçõesfinais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4 PrimeirospassoscomRails 81
4.1 Geraroalicercedaaplicação . . . . . . . . . . . . . . . . . . . . . . . . 81
4.2 Osambientesdeexecução . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.3 Osprimeiroscomandos . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.4 Osarquivosgeradospeloscaffold . . . . . . . . . . . . . . . . . . . . . 91
Mãosàmassa 97
5 Implementaçãodomodeloparaocadastrodeusuários 99
5.1 Ousuário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.2 Evitedadoserrados.Façavalidações . . . . . . . . . . . . . . . . . . . 103
6 TratandoasrequisiçõesWeb 111
6.1 Roteieasrequisiçõesparaocontrole . . . . . . . . . . . . . . . . . . . 111
6.2 Integreocontroleeaapresentação . . . . . . . . . . . . . . . . . . . . 117
6.3 Controleomass-assignment . . . . . . . . . . . . . . . . . . . . . . . . 123
6.4 Exibiçãodoperfildousuário . . . . . . . . . . . . . . . . . . . . . . . . 125
6.5 Permitaaediçãodoperfil. . . . . . . . . . . . . . . . . . . . . . . . . . 127
6.6 Reaproveiteasapresentaçõescompartials . . . . . . . . . . . . . . . . 128
6.7 Mostreoserrosnoformulário . . . . . . . . . . . . . . . . . . . . . . . 131
6.8 Configureaaçãoraiz(root) . . . . . . . . . . . . . . . . . . . . . . . . 133
7 Melhoreoprojeto 137
7.1 Liçãoobrigatória:sempreapliquecriptografiaparaarmazenarsenhas 137
7.2 Comoadicionarpluginsaoprojeto?. . . . . . . . . . . . . . . . . . . . 138
7.3 Migraçãodatabelausers . . . . . . . . . . . . . . . . . . . . . . . . . . 139
7.4 MelhoriadetemplateseCSS . . . . . . . . . . . . . . . . . . . . . . . . 142
7.5 Trabalhecomlayoutetemplatesparamelhorarsuaapresentação . . . 145
iv
CasadoCódigo Sumário
7.6 OqueéoAssetPipeline? . . . . . . . . . . . . . . . . . . . . . . . . . . 148
7.7 Criandoosnovosstylesheets . . . . . . . . . . . . . . . . . . . . . . . . 150
7.8 Feedbackemerrosdeformulário . . . . . . . . . . . . . . . . . . . . . 156
7.9 Duplicaçãodelógicanaapresentaçãonuncamais.UseosHelpers . . 157
8 Façasuaaplicaçãofalarváriaslínguas 161
8.1 Oprocessodeinternacionalização(I18n) . . . . . . . . . . . . . . . . . 161
8.2 Traduzaostemplates . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
8.3 Extra:alteraroidiomadosite . . . . . . . . . . . . . . . . . . . . . . . 170
9 Ocadastrodousuárioeaconfirmaçãodaidentidade 177
9.1 EntendaoActionMailereuseoMailCatcher . . . . . . . . . . . . . . 177
9.2 Templatesdeemail,euprecisodeles? . . . . . . . . . . . . . . . . . . . 179
9.3 Maisemailseaconfirmaçãodacontadeusuário . . . . . . . . . . . . 183
9.4 Umpouquinhodecallbackspararealizartarefaspontuais . . . . . . . 184
9.5 Roteamentocomrestrições . . . . . . . . . . . . . . . . . . . . . . . . . 187
9.6 Métodosespertoseosfindersdinâmicos . . . . . . . . . . . . . . . . . 188
9.7 Emresumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
10 Logindousuário 193
10.1 Trabalhecomasessão . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
10.2 Controleserotasparaonovorecurso . . . . . . . . . . . . . . . . . . . 196
10.3 Sessõesecookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .200
10.4 Consultasnobancodedados . . . . . . . . . . . . . . . . . . . . . . . 206
10.5 Escopodeusuárioconfirmado . . . . . . . . . . . . . . . . . . . . . . . 214
11 Controledeacesso 217
11.1 Helpersdesessão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
11.2 Nãopermitaediçãodoperfilalheio . . . . . . . . . . . . . . . . . . . . 224
11.3 Relacionandoseusobjetos . . . . . . . . . . . . . . . . . . . . . . . . . 227
11.4 Relacionequartosausuários . . . . . . . . . . . . . . . . . . . . . . . . 229
11.5 Limiteoacessousandorelacionamentos . . . . . . . . . . . . . . . . . 234
11.6 Exibiçãoelistagemdequartos . . . . . . . . . . . . . . . . . . . . . . . 238
v
Sumário CasadoCódigo
12 Avaliaçãodequartos,relacionamentosmuitosparamuitoseorganização
docódigo 245
12.1 Relacionamentosmuitos-para-muitos . . . . . . . . . . . . . . . . . . 247
12.2 Removendoobjetossemdeixarrastros . . . . . . . . . . . . . . . . . . 253
12.3 CriandoavaliaçõescompitadasdeAJAX. . . . . . . . . . . . . . . . . 254
12.4 Digaadeusaregrascomplexasdeapresentação:usepresenters . . . . 263
12.5 jQueryeRails:fazerrequisiçõesAJAXficoumuitofácil . . . . . . . . 267
12.6 Médiadeavaliaçõesusandoagregações. . . . . . . . . . . . . . . . . . 269
12.7 Aplicaçõesmodernasusamfontesmodernas . . . . . . . . . . . . . . 274
12.8 Euvejoestrelas-usandoCSSeJavaScriptparamelhorarasavaliações278
12.9 Encerrando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
13 PolindooColcho.net 287
13.1 FaçabuscastextuaisapenascomoRails . . . . . . . . . . . . . . . . . 287
13.2 URLsmaisamigáveisatravésdeslugs . . . . . . . . . . . . . . . . . . . 292
13.3 Paginaçãodedadosdeformadescomplicada . . . . . . . . . . . . . . 295
13.4 Uploaddefotosdeformasimples . . . . . . . . . . . . . . . . . . . . . 299
13.5 ColoqueaaplicaçãonoarcomoHeroku . . . . . . . . . . . . . . . . . 303
14 Próximospassos 309
ÍndiceRemissivo 315
Bibliografia 315
vi
Capítulo1
Introdução
Quem,detrêsmilênios,/Nãoécapazdesedarconta/Vivenaignorância,na
sombra,/Àmercêdosdias,dotempo.
–Goethe
Se você desenvolve para a Web, provavelmente já ouviu falar sobre Ruby on
Rails. O Ruby on Rails (ou também apenas “Rails”) é um framework open-source
paradesenvolvimentodeaplicaçõesweb,criadoporDavidHeinemeierHansson(ou
“DHH”). O framework, escrito na linguagem Ruby, foi extraído de um produto de
suaempresa,oBasecamp®(http://basecamp.com)em2003.
Desdeentãoeleficoumuitofamoso,levandotambémalinguagemRuby,ante-
riormenteapenasconhecidanoJapãoeempoucoslugaresdosEstadosUnidos,ao
mundotodo.Masporquecresceutanto?Oquealinguagemeoframeworktrouxe-
ramdenovoparasairdoanonimatoepraticamentedominaromercadodestartups
nosEstadosUnidosenomundo?
VamosprimeiroàlinguagemRuby. AlinguagemRubyfoicriadapeloextrema-
mentetalentosoprogramadorYukihiro“Matz”Matsumoto.Oobjetivodeleaocriar
1.1. Paraqueméestelivro CasadoCódigo
o Ruby em 1995 foi a felicidade e o prazer de quem programa, ao invés de perfor-
manceoualgumoutroaspectotécnico. EleusouPerlcomoinspiração,comvárias
pitadasdeSmalltalk.Veremosexemplosdessasinfluências,etambémoquesignifica
esta“felicidadeparaoprogramador”nocapítulo2.
Quanto ao Rails, na época em que foi lançado, trouxe uma visão diferente ao
desenvolvimento Web. Naquele momento, desenvolver para Web era cansativo, os
frameworkseramcomplicadosouresultavamemsistemasdifíceisdesemanterede
baixaqualidade.
ODHH,aodesenvolveroBasecamp, pensouprincipalmentenosseguintesas-
pectos:
• “Convention over configuration”, ou convenção à configuração: ao invés de
configurarumconjuntodearquivosXML,porexemplo,adota-seaconvenção
eapenasmuda-seoquefornecessário;
• “DontRepeatYourself”,ou“nãoserepita":nuncavocêdevefazermaisdeuma
vezoquefornecessário(comochecarumaregradenegócio);
• Automaçãodetarefasrepetidas:nenhumprogramadordeveperdertempoem
tarefasrepetitivasesiminvestirseutempoemresolverproblemasinteressan-
tes.
EssesconceitossãoamplamenteexploradosnoclássicoThePragmaticProgram-
mer: From Journeyman to Master [1], leitura recomendada. Esta soma de tecnolo-
giasepráticassãobastanteprazerosasdesetrabalhar;épossívelrealizarmuitocom
pouco tempo e você verá, capítulo a capítulo, como essas ideias são representadas
emtodososaspectosdoframework.
1.1 Para quem é este livro
OobjetivodestelivroéapresentarumpoucodalinguagemRubyeaprenderospri-
meiros passos a desenvolver com o framework Ruby on Rails. Mais além, vamos
aprender a desenvolver aplicativos com Rails. Algumas vezes usaremos inclusive
componentesfeitosemRubypuro.Essesmomentossãoextremamenteimportantes
paraaprendermostambémalgumasboaspráticas.
Tendoissoemmente,estelivroserveparapessoasque:
• Nãoconhecemambasastecnologias,ouconhecemapenasRuby,masdesejam
conheceroRails;
2
Description:Mais que um tutorial, um livro que ensina tudo o que você precisa sobre o Ruby on Rails 4. Não perca tempo com frameworks arcaicos e burocráticos. O Ruby on Rails, um dos frameworks mais populares do mercado brasileiro e do mundo, é ágil, completo e não fica no seu caminho, ajudando-o a focar