You are on page 1of 197

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.

95Betapag1/197actualizadoal06/01/13

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag2/197actualizadoal06/01/13

Udpodraestarleyendounacopiavieja!

Chequeelaversinenelencabezadodelashojas,contralaltimaenelsitiooficial,
http://r3uw.heroku.com
Desdeallencontrarelvnculohacialaversinmasactual,yunlistadomuytildeerratas,
correcciones,einclusounaseccindondepostearerroresysugerencias.

Estelibroestangratiscomounacerveza(freeasabeer).CuentesiempreconlaltimaversindisponibleenPDF.Mi
objetivoesquelolealamayorcantidadposibledepersonas,yquestasmeretornensusimpresiones,erroresencontrados
ysugerenciasengeneral.
Dehecho,necesitodeestosreportesparaobtenerunnivelapreciabledecalidad,talqueellibroseadignodeserllevado
aunaimprenta.
Unavezqueellibroestelisto,pretendoseguirdejndololibre,publicarloenlaeditorialBubok(impresinademanda),y
quedarmecomomuchoconu$s5deregalasporlibro...almenosparahacerlecreeramiesposaquehagodinerocon
esto.Creoquesiellibrolomerece,lagentesecansardeleerloenpantalla,yquerrtenerunejemplarenpapel.
Adems,ledarlaoportunidadaloslectoresdetenerellibroenpapel,ydeconvertirseenlaenvidiadecompaerosy
amigos.
SergioA.Alonso

[ Portada: Lic. Vernica V. Martnez

[ Copyleft 2012 Sergio A. Alonso

[ E-mail / MSN: sergio (at) eim.esc.edu.ar ]


[ Twitter: @karancho

[ http://ar.linkedin.com/in/alonsosergio

[ Blog: http://obelix.bunker.org.ar

[ http://about.me/elbunker

[ Hi, I am the root here. If you see me laughing, ]


[ you'd better have a backup ready.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag3/197actualizadoal06/01/13

ndice de contenido
Introduccin a la presente obra................................................................................................................................8
OS Wars Disclaimer............................................................................................................................................8
Everybody loves Screenshots..............................................................................................................................9
Por qu utilizar Ruby para escribir pginas Web?...........................................................................................10
Mas piedras preciosas....................................................................................................................................... 11
Captulo 1: Instalacin y Creacin de un Marco de Trabajo................................................................................. 13
Aclaraciones previas ........................................................................................................................................ 14
GEM............................................................................................................................................................. 14
Bases de Datos............................................................................................................................................. 14
SQLite.......................................................................................................................................................... 15
Instalacin en Ubuntu (y extensible a Debian con mnimas modificaciones).................................................. 16
Instalar GEM................................................................................................................................................ 17
MySQL bajo Linux Ubuntu......................................................................................................................... 21
Instalacin de SQLite bajo Linux Ubuntu ...................................................................................................21
Ventanas, en Linux........................................................................................................................................... 22
RDOC y RI....................................................................................................................................................... 22
Instalacin en Windows ................................................................................................................................... 24
DevKit.......................................................................................................................................................... 25
Instalacin de GEM y Rails en Windows.................................................................................................... 26
SQLite bajo Windows.................................................................................................................................. 27
MySQL bajo Windows.................................................................................................................................27
Administradores para SQLite, Windows.......................................................................................................... 29
Microsoft SQL Server.......................................................................................................................................30
Ahora si: Rails 3 en Windows...........................................................................................................................30
Comprobar todo................................................................................................................................................ 31
Editores............................................................................................................................................................. 34
[IDEs] vs [Editores simples + IRB]............................................................................................................. 34
Editores........................................................................................................................................................ 36
Vim (Windows y Linux)............................................................................................................................ 36
Sublime (Windows y Linux)...................................................................................................................... 39
RedCar (Linux y Windows)....................................................................................................................... 39

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag4/197actualizadoal06/01/13

IDEs.................................................................................................................................................................. 41
Netbeans (Linux y Windows).....................................................................................................................42
Rubymine (Linux y Windows)................................................................................................................... 43
Otras herramientas tiles.................................................................................................................................. 44
Dadme un punto de apoyo y mover el mundo
Arquimedes.................................................................................................................................................. 44
Consola / Terminal / MSDOS..................................................................................................................... 44
Windows / Linux: Firebug......................................................................................................................... 45
Windows / Linux: Web Developer............................................................................................................. 45
Captulo 2: Un poco de Ruby.................................................................................................................................47
IRB... o "el polgono de tiro"............................................................................................................................ 47
For vs Iterar.......................................................................................................................................................48
Fechas............................................................................................................................................................... 48
Arreglos............................................................................................................................................................ 49
Bloques vs For.................................................................................................................................................. 50
Diccionarios (en rigor: Hash) .......................................................................................................................... 51
Smbolos como ndices..................................................................................................................................... 51
Modelo try -- catch - finally..............................................................................................................................52
Acceso a bases de datos sin uso de ActiveRecord o Rails... todava................................................................ 53
Acceso a MySQL......................................................................................................................................... 53
Acceso a MSSQL.........................................................................................................................................53
Bindings grficos.............................................................................................................................................. 55
Mdulos............................................................................................................................................................ 57
Clases................................................................................................................................................................ 58
Herencia....................................................................................................................................................... 59
Clases temporales......................................................................................................................................... 61
Entrada por lnea de comandos......................................................................................................................... 61
Mtodos Bang!.................................................................................................................................................. 61
Captulo 3: Frameworks....................................................................................................................................... 63
Algunas caractersticas del framework Rails.................................................................................................... 63
Frameworks MVC.............................................................................................................................................64
Algo ms respecto del Modelo......................................................................................................................... 66
Captulo 4: Bienvenidos al Tren............................................................................................................................ 67
Crear una Aplicacin........................................................................................................................................ 67

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag5/197actualizadoal06/01/13

Integrar GIT al proyecto................................................................................................................................... 70


Instalacin de GIT........................................................................................................................................70
Utilizar GIT en forma local ......................................................................................................................... 71
Agregando y cambiando archivos................................................................................................................ 74
La bitcora del maquinista II........................................................................................................................77
Trabajar con ramas y nmeros de versin.................................................................................................... 79
Borrando / modificando cosas antes del commit ("entrega").......................................................................81
Borrando / modificando cosas despus del commit.....................................................................................83
Revert, Reset, Checkout............................................................................................................................... 88
Resumen de este captulo..................................................................................................................................89
Captulo 5: Hola Mundo en Rails..........................................................................................................................90
Controladores y Acciones................................................................................................................................. 91
Reapuntando la pgina principal...................................................................................................................... 95
Captulo 6: ActiveRecord...................................................................................................................................... 98
Ejemplo de creacin de modelo, y alteracin de las convenciones................................................................ 100
Comprobar todo.............................................................................................................................................. 102
Resumen..........................................................................................................................................................103
Desarrollar, Testear, Producir..........................................................................................................................104
Captulo 7: A levantar los andamios: Scaffolds................................................................................................... 106
Caminar hasta la locomotora...........................................................................................................................109
La bitcora del maquinista.............................................................................................................................. 110
Captulo 8: Validaciones...................................................................................................................................... 112
Captulo 9: La imagen no es nada: Layouts y CSS.............................................................................................. 113
Actividades...................................................................................................................................................... 114
Captulo 10: Uno para Todos................................................................................................................................116
Tablas Combinadas..........................................................................................................................................117
Formalizar la relacin......................................................................................................................................119
Integridad Referencial.....................................................................................................................................120
Jugar con Tablas Combinadas en Rails Console ............................................................................................122
Querido diario................................................................................................................................................. 123
Partials............................................................................................................................................................ 125
Partials "a mano"........................................................................................................................................125
Ahhh rompi algo!......................................................................................................................................126
Me olvid de agregar unos campos! scaffold_controller.......................................................................... 127

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag6/197actualizadoal06/01/13

El problema................................................................................................................................................ 127
Uno a muchos => Combo SELECT, Radio Buttons....................................................................................... 129
ORM... de nuevo............................................................................................................................................. 131
Tengo muchas tablas, ndices y campos!....................................................................................................... 132
Estrategia 1.................................................................................................................................................132
Estrategia 2.................................................................................................................................................134
Captulo 11: Muchos a Muchos => Checkboxs................................................................................................... 136
Cargar departamentos.................................................................................................................................137
Creacin del ABM de proyectos..................................................................................................................... 139
Crear tabla relacin......................................................................................................................................... 140
Formalizamos la relacin entre las tablas...................................................................................................141
Controlar la relacin................................................................................................................................... 141
Ahora s: los CHECKBOX..............................................................................................................................149
Cambios en el controlador.............................................................................................................................. 150
Algo mas respecto de las vistas:..................................................................................................................... 150
Y el show? (yapa!)...................................................................................................................................151
Jugando con MVC............................................................................................................................................... 153
Mapear Rutas y Controladores........................................................................................................................154
La Vista...................................................................................................................................................... 155
El Controlador.................................................................................................................................................157
Server de Produccin...........................................................................................................................................159
Server de Produccin en Windows................................................................................................................. 162
Preparar Base..............................................................................................................................................162
Instalar Mongrel como servicio................................................................................................................. 163
Configurar Apache..................................................................................................................................... 164
Errores........................................................................................................................................................ 165
Links recomendados: .................................................................................................................................167
Server de Produccin en Linux Ubuntu.......................................................................................................... 167
VirtualHosts............................................................................................................................................... 169
Multihosting............................................................................................................................................... 172
Alojar el proyecto sobre un Cloud....................................................................................................................... 174
GitHub o Heroku?......................................................................................................................................... 174
Alojar y Compartir en Heroku........................................................................................................................ 174
Retomar o Colaborar con un proyecto alojado en Heroku.............................................................................. 177

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag7/197actualizadoal06/01/13

Ayuda!................................................................................................................................................................ 179
Debuggear en Ruby......................................................................................................................................... 179
Debuggear en Rails......................................................................................................................................... 179
Para debuggear en la vista.......................................................................................................................... 180
Para debuggear en el controlador............................................................................................................... 180
Listas de Correo.............................................................................................................................................. 182
Twitter............................................................................................................................................................. 183
Cheatsheets y RI..............................................................................................................................................184
Links Recomendados & Imperdibles...................................................................................................................186
Polgono de tiro para captulos nuevos................................................................................................................ 188
Sistema de login en rama testing de GIT........................................................................................................ 189
Tu Ruta es mi Ruta (link_to & rake routes)................................................................................................192
Su identificacin, por favor........................................................................................................................ 192
Internacionalizacin (i18n)............................................................................................................................. 194

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag8/197actualizadoal06/01/13

Introduccin a la presente obra


Misestimadoslectores:lesagradezcolaaperturadeestaspaginas.Lasmismashansido
confeccionadasconcario,revisadascientosdevecesenbuscasdeerrorese
incompatibilidades,yesperosinceramentecumplanvuestrasexpectativas.
Laconfeccindeestelibroapuntaprincipalmenteadotardedocumentacinenespaol
aaquellosdesarrolladoresquehandecididodisfrutardelaprogramacinWeb.
Efectivamente,lonicoquelequitadiversinaRails,estenerqueleerlabibliografaen
ingls.
Locualesunaparadoja,puestoqueRailshasidoconcebidoparahacerfelicesalos
programadores:sinimportarcuanvelocesseamosleyendoenlalenguaanglosajona,el
factordeplacersereduce.Yaunqueseapoquito...yasaben.Conelplacernosejuega.
Atalesefectos,loheredactadodetalmanera,queselopuedamaridarconunabuena
cervezafra,depreferencianegra.Nocualquiera,ojo.

OS Wars Disclaimer
<antiflama mode="activado">

Otraraznporlacualheacometidolaconfeccindeestelibro,esacercaralosusuarios
deWindowsyLinuxhaciaesteframework.ParticularmentealosusuariosdeWindows,
porquetodavalescuestamuchosalirdelosentornosunificados,centralizadosyalmenos
paramiagobiantes.Ladescentralizacindelentornodetrabajoesunadelasmejores
experienciasquepuedatenerunprogramadordeespritulibre.
Mediantelosejemplos,esperoanimarlosaquepruebenRailsbajoLinux.Ladiferenciaes
mnima.Porcierto,elenfoqueapuntaausarRubyenunadistribucinabanderadapor
aquellosnovatosquerecinempiezanconelsistemaoperativodelpinginito,elamabley
confiableUbuntu.Ynoquierodejardeladoalgunasinstruccionesparasuscurtidos
administradores,quienesprobablementevayanaalojarnuestraaplicacincuandoesta
comienceatambalearsebajoelpesodelasconsultas.Esdecir,cuandosearentable.
Deliberadamente,hedejadodeladoaOS/X.Unapena,puestoquesehaerigidoenestos
ltimosaoscomolapanaceaquejuntalomejordeambosmundos.Sinembargo,nome

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag9/197actualizadoal06/01/13

sientoculpable.Sucedequeeltercermundo,dedondeprovengo,unaMaccuestael
equivalenteamedioaodesueldo.Yporotrolado,yahaymucha,ymuybuena
documentacin:lacomunidaddeestesistemaoperativohasidoquienmshaadoptado
aRails.Porsupuesto,losejemplostambinsonvlidosparaellos.
Paranollenardehojasextraselpresentevolumen,tambinhedejadodeladounsistema
operativoquemegustamucho:FreeBSD.LosesperoenmiBlog,http://obelix.bunker.org.ar,
porinquietudesalrespecto.
Esfrecuenteencontrarenlasconvencionesderubystas,enlosGoogleSummerofCode,y
otroseventos,avariosprogramadorestrabajandoenunmismoproyecto.Simiranlas
pantallasdelasnotebooks,consorpresanotaranquecadaunotrabajaenelsistema
operativoqueseleantoja.Losmantieneunidos,enprimerlugar,lafantsticaherramienta
"gems".Yensegundolugar,algnmanejadorparagestionarconcurrenciadeversiones,
comoGIT.Ambasherramientassernutilizadasfrecuentementeenlapresenteobra.

Everybody loves Screenshots


Tiendomuchoaejemplificarmediantecapturasdepantalla.Nosoloejemplificanmuybien,
sinoquedemuestranquealguienpudohacerfuncionarelejemplo(1).
PodrnnotarquelascapturasdepantallaalternantodoeltiempoentreWindowsXP,
Seven,2003server,yUbuntu,einclusoentrevarioswindowsmanagers(Gnome,KDE,
Fluxbox).Yparacompletarlo,entrevariosnavegadorescondistintostemas.
Deboconfesarquelaconstruccindeestelibrofuerealizadaencadamaquinadonde
tuveunratolibreparasentarme.LaplasticidadycompatibilidaddeRubymepermiti
instalargemassobretodaclasedesistemasoperativos.MedianteGIT,sincronizabael
cdigonoimportadondeestuviera.Bastaunosinstaladoresamano,oaptgetenLinux,y
listo.
Finalmente,dejlascapturasascomolapodrnver.Laideaesdemostrarlacapacidad
quetendrnuestraaplicacinparaejecutarseindistintamentesobrecualquierplataforma.

1 Amenosquedepuromalvado,ymedianteGimp,muestrecosasqueenrealidadnofuncionan...
muajajajah!

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag10/197actualizadoal06/01/13

Por qu utilizar Ruby para escribir pginas Web?


Semeocurreunamultitudderazones.Paraempezar,Rubyesunlenguajenacidoenlaera
deInternet.Notuvoqueadecuarseanuevosparadigmasniincorporarfuncionesenforma
confusayapresurada.Escompletamentelibre,locualgarantizaunbuenacantidadde
mantenedoresyauditoresdelcdigo.Ycomosusancestrosconceptuales,heredamuchas
buenasideas,talescomolaorientacinaobjetos,manejodeexpresionesregulares,yvarias
funcionesqueveremosmasadelante(2).
Unaspectodestacable,esqueRubyesellenguajeidealparacrearaplicacionesparala
Web2.0.
Estetrmino,Web2.0,esunconceptoamplioyabstracto.Yesmasfcilentenderlo
observandosusconsecuenciasactuales.Yendoalogeneral,apuntaalaideadesitios
colaborativos,compuestospormuchaspersonas(yotrossitios)interactuando.Lasredes
socialessonunbuenejemplo.LaWeb2.0tienetambinuncomportamientovisible,omejor
dicho,invisible,yaqueescondealaverdaderaWeb,einclusoInternet,paraelusuario
ocupadodehoy(3).
Yaquedaronenlos90lasprimitivasinterfacesdeantao,quedelatabanlasincronicidad
delaWeb,enlacualtodobotnoeventodetiposubmitocasionabalarecargacompleta
delapgina.
TambinvanendisminucinaquellascompuestasexclusivamenteporFlash,conexcepcin
ocasionaldeaquellosquehansidocapacesdeentenderatiempoaFlexyelprotocolo
MXML.
Hoyseapuntaaunmezcla,unrescatedeloscontrolesoriginales<input>,peroconun
#toqueamigable,intuitivo,talqueelusuarioapenassedecuentadelapermanente
necesidadquetienelainterfacecliente,decomunicarseconlaaplicacinservidora.
Paralograrlo,laWeb2.0seapoyaenestndares,softwarelibre,documentacinabierta,y
engeneralrespetoarajatablaporlos7nivelesdelmodeloOSI.
Sinembargo,todaesainteractividadinvisible,noesfcildelograr.Paraserexacto,esmuy
difcildecompaginar,debidoalacantidaddetecnologaqueformalamezcla.Elusuario,
impacientecomounhmsterseleccionandosemillasdegirasol,notieneideadela
2 Rubytienemasabuelosqueunclubdejubilados.Hastadondepudesaber,incluyealosvenerables:Perl,
Eiffel,LISP,Smalltalk,yelasombrosonewkidontheblock,Python.
3 Si,estoysiendosarcstico.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag11/197actualizadoal06/01/13

cantidaddecosasqueseencadenancadavezquehaceclick.
Hastaestepunto,RubynodifieretantodeotroslenguajesparalaWeb.Armarunainterface
Web2.0puedetomaruntiempoapenasmenor.
Cualesladiferencia?
LadiferenciaestribaenquelosprogramadoresWeb,tardeotempranodebenaprendera
usarunframework.Programarcomportamientosenriquecidosamanopuedellegaraser
desquiciante.Losframeworks,encambio,poseenlibreras,scripts,patronesdediseo,que
seencargandelidiarconciertosaspectoscuyasparticularidadesentorpecenelplacerde
lacreacin.
YlosframeworksdeRubysonlosmsfcilesdeaprenderdelmercado.Todosellosnos
permiten(yobligan)ahacerusodestandaresdelaWeb2.0,talescomoCSS,Ajax,XML,
Json,YML,pormencionarsoloalgunas.Deestamanera,esrelativamentesimpleinteractuar
conFlex(Flash),APIsdelosprincipalesclouds,ybindingsdetodotipohaciaJava,.NETyC+
+.Tambinsellevamuybiencontodaclasedemtodosqueguardanocachean
informacin,tantodelladoservidor(SQL,NOSQL)comodelladocliente(SQLite,AIR).
Ycomositodoestofuerapoco,lasintaxisdeRubyesnatural,seleemsfcil,esoriginal,
limpia,atrevida.PorestasrazonestildanalosprogramadoresdeRubydemetrosexuales,lo
cualquizsnoestexentoderazn.

Mas piedras preciosas


OtrascaractersticasquepodemosencontrarenRuby:

Soportamultihilos...hastaenMSDOS!

Orientadocompletamenteaobjetos.

Permiteintervenirlosobjetosentiempodeejecucin.

ParecidoenalgunosaspectosalgenialPython,peroadiferenciadeste,Rubyhasta
el2000noestabatraducidoalingls

Si,yalodije.Perolodigodenuevo:poseebindingshacia

C++

Java

.NET

Python

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag12/197actualizadoal06/01/13

Tk

Manejaexcepciones.

Escapazdedocumentarunaaplicacinconsolousarelcomandordoc.

Poseeaccesoaladocumentacininstaladadelsistema,medianteloscomandosriy
fxri.

Poseeunacomunidadmuygrandededesarrolladores,loscualestodoeltiempo
fabricanclasesyobjetosasombrosos.Parecenpersonasmuyfelicescompartindolo
todo.Loson,desdequelesconcedieronasilopoltico...cuandoarribarondesdelas
sperascostasdeJavayC++

LosprogramasdeRubycorrenconlamismasintaxisenlamayoradelossistemas
operativosconocidos.Solohayquecuidarquecuentenconlasmismaslibreras,oal
menos,libreras(gemas)portadasalsistemaoperativoqueestemosusando.Tambien
estaeslaraznporlacualRubyesptimopararealizarscriptingeinstruccionesde
deploy.

Finalmente,suportabilidadhaciavariossistemasoperativossepudeobservaren
eventostipoSummerofCodeycongresosderubystas,dondeesfrecuentever
programadoresdeRubyconectadosvaGIT/SVN,desdesusequiposconWindows,
MACOS/X,Linux,einclusodesdecelularescorriendoAndroid,coexistiendo
pacficamenteycolaborandojuntos.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag13/197actualizadoal06/01/13

Captulo1
Captulo 1: Instalacin y Creacin de un Marco de Trabajo
Entrelasmuchasdiscusionesquedividenalosprogramadores,hayunaenparticularquese
distingueporsupasin:laintegracindelentornodetrabajo.
Hayprogramadoresquesesientencmodosdentrodeentornosqueleprovean
absolutamentetodo.EntreellospodemosencontraralosusuariosdeVisualStudio,Eclipseo
NetBeans(Java).
Otrosprogramadores,encambio,prefierenladesmodularizacindelaspartes,esdecir,
componentespequeos,enloposiblelibresygratuitos.
Siadivinacorrectamente,elmundodeRubyseconstruyedesdeelsegundoenfoque.La
naturalezaylibertaddeRubyocasionaqueexistanmuchasopcionespararealizaruna
mismatarea.SibienexistenIDEsconmuchasumadepartes,talescomoEclipseAptana
StudiooRubymine,coneltiempocoincidirconmigoenqueunlivianoeditoryunas
cuantasherramientasestodoloquehacefalta.
EnestecaptuloinstalaremosRuby,unmanejadordepaquetesllamadoGEM,yatravsde
GEM,lagemaRails.Tambinlerecomendarotraspiezasdesoftwarequemehansidode
muchautilidad.
Esperoqueconellasconstruyaunmarcoagradabledetrabajo,personalizadoasugusto.
Porsiquieredarseunavuelta,esteelmo:http://www.bunker.org.ar/incubadora.varios/ruby

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag14/197actualizadoal06/01/13

Aclaraciones previas
GEM
EsimportanteaclararunaspectoqueconfundealosnovatosenRails.Esteframeworkes
unagemadeRuby.Porlotanto,debemostenerinstaladostantoRubycomoGEM.
GEMesuninteligenteinstaladordepaquetes,utilidadesylibreras.Esanlogoalgestorde
paquetesaptgetdeDebian/Ubuntu,perofuncionasobrecualquiersistemaoperativoque
estsoportadoporRuby.

Bases de Datos
CulSQLestoyusando?
Cualquiera,encualquiermomentodelastresfasesdedesarrollo.Incluso,eninstalaciones
realmentegrandes,podranousarSQL(4).
LosprogramadoresdeRubysuelenusarSQLiteparalasetapasDevelopmentyTesting,en
suspropiasmaquinasdedesarrollo,poruntemadecomodidadyahorroderecursos.
Cuandopasanaproduccin,subenlaaplicacinalservidormedianteGIT(oMercurial,
Subversion,etc)+Capistrano,ydeployansobrealgnmotormasgrande,comoMySQL,
PostgreSQL,Oracle,oMSSQL.Porsupuesto,estecomportamientonoesobligatorio,perosi
eselmasrecomendadoporlacomunidad.Igualmente,veremoscomoinstalarservidores
deproduccintantosobreWindowscomosobreUbuntuLinux.
Comohabamosmencionado,ActiveRecordseencargadelidiarconlasdiferenciasde
sintaxisSQLpropiasdecadamotor.

PrximamenteveremoscomoelcomponenteVistadeRails,elActiveRecord,buscaque
nolidiemosconlasparticularidadesdelasbasesdedatos.ComotodalibreraORM,trata
deaislarnosdelasmaneraspropiasyparticularesenque"sehacenlascosas"dentrodeun
motorSQLenparticular.

4 http://del.icio.us/karancho/nosql

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag15/197actualizadoal06/01/13

SQLite
SQLiteEsunpequeoygilmotorRDBMS,muyembebibleytransportable.Seusaen
montonesdepequeasaplicacionesyminiframeworks,usualmentedelladodelcliente,
talescomoGoogleGears,paralasversionesofflinedeGmail,CalendaryReader,oAdobe
Air,etc.
Estosloaplicanparacacheardatos,bufferizarlos,omantenerlosofflineparaposteriores
sincronizaciones.Podemosusarlocmodamentetambinenelladodelservidor,puesto
quenorequieredeundaemonniconfiguracinalguna.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag16/197actualizadoal06/01/13

Instalacin en Ubuntu (y extensible a Debian con mnimas modificaciones)


Primero:Ruby.EnLinuxUbuntu,abrimosunaterminal,yescribimoslasiguienteorden:
NoCopiePeguedelPDF:elformatodedestino(ASCII,UTF8,ISO)puedevariarenel
destino.Escribacadalneamanualmente
sudo apt-get install irb ruby1.8 rdoc ri libopenssl-ruby ruby1.8-dev
sudo apt-get install libreadline-ruby1.8 ruby sqlite3 libsqlite3-dev
sudo apt-get install libdbd-sqlite3-ruby terminator build-essential

Puedereemplazarruby1.8por1.9simplementecambiandoelnumero8porel9enel
nombredelospaquetes.Entrminosgenerales:

Ruby1.9esmuchomasrpidoque1.8

Sinembargo,algunasfuncionesmuy"estables"ycomprobadasen1.8nofuncionan
todavaen1.9

Finalmente,ciertasfuncionesmuyavanzadas,naturalmenteseencuentran
disponiblessoloen1.9

Sivaainstalarunservernomuyrpido,ynoquieresorpresas,utilice1.8

SinecesitamantenerbajoLinuxambasversionesensimultneo,puedeutilizarRVM
(RubyVersinManager).

ProblemasconelProxy?
EnLinuxhayunseteogeneralenelquetodaslasaplicacinsefijan,ubicadoenSistema
PreferenciasProxydelaRed.Alternativamente,puedeconfigurarCURL,elgestorde
descargasqueusanvariasdelasaplicaciones,editandoelarchivo~/.curlrcyagregando
adentrolavariableproxy.Amododeejemplo:
proxy = proxy.mendoza.gov.ar:8080

OtrosprogramascomoRVMoGEMtambinpuedentomarvaloresproxydesdelneade
comandos.Ejemplo:
gem1.8 install --http-proxy http://proxy.mendoza.gov.ar:8080 rails

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag17/197actualizadoal06/01/13

Instalar GEM
Necesitaremoslautilidadgemparainstalarvarioscomponentes.EnLinuxUbuntupodramos
realizarunainstalacindesdelosrepositorios,medianteelconocidoaptgetinstallgem.Sin
embargo,estecomponentenosiempreseencuentraactualizado.EnlacomunidadRuby
recomiendanseguirlossiguientespasos:
1. BajarlaultimaversindeGemdesde
http://rubyforge.org/projects/rubygems
2. Descomprimirelarchivoenunacarpeta
3. Ejecutar
ruby setup.rb

sudo ruby setup.rb

4. Sigemyaestinstalado,puedeactualizarlomediante
gem update --system

sudo gem1.8 update --system

5. Probemosinstalandounalibreranecesaria:
gem install execjs -V

sudo gem1.8 install execjs -V

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag18/197actualizadoal06/01/13

gemogem1.8?
Anoconfundirse:enLinuxpodramoshaberinstaladoelcomandogemmedianteaptitude
oaptget.DebidoalavelocidadconlaqueocurrencambiosenlacomunidaddeRuby,
habamosmencionadolaposibilidadqueestaversinseencuentredesactualizada.
SibajamoseinstalamosGemmanualmente,desderubyforge,tendremosdosGem
instaladas.Sillamamosagem1.8,nosestaremosrefiriendoalaversinprocedentede
rubyforge,yrecomendadaparalosejemplosdeestelibro.
Enpocaspalabras:siustedllamaalcomandogemasecasenLinux,yesteresponde,es
porqueestausandolaversindelosrepositorios.Sillama,yrespondecorrectamente
gem1.8,esporqueusalarecomendadadellibro.Ambaspuedenestarinstaladasen
simultaneo,peroesrecomendadousarsolouna.

Framework Javascript
RailsnecesitadealguninterpreteJavascriptinstaladoenalgunlado.Haydosmanerasde
satisfacerletalnecesidad.
1) MedianteUbuntu:
sudo apt-get install nodejs

2) Omedianteelsistemadegemas.AgregandoalarchivoGemfileunalnea
gem 'therubyracer'

ycorriendoluego
bundle install

Obajandodirectamentelagemaalsistema
sudo gem1.8 install therubyracer

Ahorasi:Rails3
sudo gem1.8 install rails -V

Rails3instalaenformaautomticavariasdependenciaspropias,yuncomponente
llamadobundle.BundlerevisaelGemfiledecadaproyecto,ygeneraunainstalacindelas
gemasqueseencuentrenindicadasadentro.Esmuytilparacuandoagregamos
posteriormentegemasalproyecto.Sicambiamosdeequipo,bastaconcorrerdentrodel
proyecto(nohacefaltaquelohagaahora):
sudo bundle install

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag19/197actualizadoal06/01/13

Ydeestamanera,laotracomputadoratendrtambinlasgemasnecesarias.Estoesmuy
tilcuandocopiamoslaaplicacinalserverdeproduccin.Porsupuesto,shitcould
happens,peroesunaventajaenormerespectodeotrosframeworksquenotienensiquiera
pensadocomomigrartodoelproyectoentrecambiosdelibreras,odelaversindel
lenguajeusado.
Enelsiguienteejemplo,siestamosusandoRailsconunaversinmenora3.1,elpaso3es
manual.
1)

rails new cualquiera

Fabricaelproyecto

2)

cd cualquiera

Entraalproyecto

3)

sudo bundle install

InstalalibrerasnecesariasparaesteproyectoRailsen
particular

Esoestodo.Podemosborrarelproyectocualquiera,yaqueposeemostodaslasgemas
necesariasenelsistemaparaempezaratrabajar.Estepequeoaprendizajeesmuytil
paracuandoconstruyaunaaplicacindependientedesabrosasgemasqueobtengaen
internet,ydeseequecuandoelproyectosubaaunserverdeproduccin,porejemplo
Heroku.UsteddeberaanotarenelarchivoGemfiletodaslasgemasquesevayabajando
deinternet,afinqueduranteelprocesodedeployremoto,Railssolicitequelesatisfagan
lasmismasgemasquetieneenlamaquinadedesarrollo.
NotaenDebian:UnodelasgemasquesuelesolicitarRails3,vaBundler,esla
correspondienteaSQLite.YestodaalgunosproblemasbajoDebian5"Lenny",sobrelacual
esposiblequedebacorreralgunaslneasextras(5).
5 EnDebian,revisesiposeelaversin5Lennyolaversin6Squeezemedianteelcomandocat/etc/lsb
release.Enelcasode6Squeeze,lospasosparainstalarRubyyRailssonbastanteaproximadosalos
Ubuntu.Encambio5LennysoloposeeRuby1.8.6enlosrepositorios,insuficientesparaRails3,demodo
quedeberaseguirlassiguientesinstrucciones:

Abracomoroot(comandosuroot)elarchivo/etc/apt/sources.listyagreguelasiguientelneaal
final:

deb http://www.backports.org/debian lenny-backports main contrib non-free

Luegoejecute

aptitude install debian-backports-keyring


aptitude update

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag20/197actualizadoal06/01/13

Unavezterminadalainstalacin,convienerevisarlaversin:
rails -v

Antesdecomenzaraprobar,decidaquetipodebasededatosdeseausar,yavanceunos
captulosparachequearlainstalacinnecesaria.

Finalmente,podrinstalarSQLitemediante

aptitude -t lenny-backports install sqlite3 libsqlite3-dev


gem1.8 install -V sqlite3-ruby
Fuente:
http://www.fangiotophia.com/journal/2010/8/31/randomactofstupidity6debianrails3setupguide.html

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag21/197actualizadoal06/01/13

MySQL bajo Linux Ubuntu


Consulteconelcomandoaptitudesearchlaversinactualdelospaquetesrubydevy
libmysqlclient18dev.EnversionessuperioresaUbuntu10.10Maverick,aptitudepuedeser
obtenidomediantesudoaptgetinstallaptitude
Cuidadoalcopiar/pegar!

sudo apt-get install make ruby-dev mysql-server libmysqlclient-dev

sudo gem1.8 install -V mysql

AdministradoresOpcionalesparaMySQL:
PararevisarelestadodeMySQL,yocasionalmenteadministrarsusdatos,sepuedeinstalar
lossiguientespaquetes:
sudo apt-get install mysql-navigator

Tambinpuedebajardeinternetlaversinportabledelmagnifico
HeidiSQL(http://www.heidisql.com/)paraWindows.
ParacorrerloenLinuxsolonecesitaejecutarelarchivoheidisql.exe
anteponiendoelcomandowine.
SiextraaaphpMyadmin,puedeinstalarlofcilmentemediante
sudo apt-get install tasksel
sudo taskel install lamp-server
sudo apt-get install phpmyadmin
sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin

Luego,busqueaphpmyadminenhttp://localhost/phpmyadmin

Instalacin de SQLite bajo Linux Ubuntu


sudo apt-get install sqlite3 libsqlite3-dev libdbd-sqlite3-ruby
sudo gem1.8 install -V sqlite3-ruby

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag22/197actualizadoal06/01/13

Administradores para SQLite en Linux


Posiblementenonecesiteherramientasextrasparaadministrarlabase.Peroquizsdesee
sabersilosdatosseestnescribiendoylasmigracionescorriendo.Noobstanterecuerde
queloidealesutilizarparaestosmenesteresalaconsolarails(railsconsole)olaconsoladel
motorsql(railsdbconsole).Aqulepresentotresopciones:
sudo apt-get install sqliteman sqlitebrowser

Alternativamente,lerecomiendoinstalarademselplugindeFirefoxdescriptoenel
apartadoAdministradoresparaSQLiteenWindows,unaspaginasmasadelante.

Ventanas, en Linux
Sibienenestelibronocubrimosestefascinantetema,siemprehaygentequenecesitao
deseaventanas,alestilodeVisualBasic,sobrelascualesesmasfcilintroducirelementos
enriquecidos.InspiradoenelmagnificowxPython,tiendoausarwxRuby,cuyainstalacines
lasiguiente:
sudo apt-get install libwxgtk2.8-dev libwxbase2.8-0
sudo gem1.8 install -r wxruby
gem environment | grep INSTALLATION

Enelsiguientevnculopuedeencontrarvariasguasparadesarrollarenpocotiempo
aplicacionesenriquecidas:http://wxruby.rubyforge.org/wiki/wiki.pl?WxRuby_Tutorial
OtarsmuybuenasopcionesdisponiblesenelmercadosonTK(laopcinoficial),Shoes,y
FXRuby(soloparaWindows).

RDOC y RI
Quizsustedesdelosprogramadoresquenolesgustatrabajarenmanualesdesus
aplicaciones.Manualesqueprobablementesususuariosnoleern.Entonceslealegrar
saberqueRubyposeeuncomandollamadordoc.Alestilodejdoc,estecomando,
ejecutadoenlarazdelaaplicacin,puedecrearnosautomticamentelamayorpartede
ladocumentacin.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag23/197actualizadoal06/01/13

TambinpuedeinstalarloenDebian/Ubuntumedianteaptget.
Adems,lapresenciadeestepaqueteevitaalgunosmolestoswarningsdurantela
instalacindealgunasgemas.Alternativamente,puedeejecutar:

sudo gem1.8 install -V rdoc

sudo gem1.8 install -V rdoc-data

Adems,Rubyofreceunaayudaenpantallasobremuchasdesusfunciones.Noesque
desconfiemosdeGoogle,perori(RubyInformation)nospuededesambiguarrpidamente
lasdudas.Primero,ejecute:

sudo rdoc-data --install

sudo gem1.8 rdoc --all --overwrite

Serabuenaideacomprobarsilaayudaenpantallaestfuncionando.Porejemplo,sino
recordamoslanomenclaturadelosmtodos,yqueremosverunejemplo:

ri methods

(qparasalirdellessinvocadoporri)
Estodevuelveunalistadelosmtodosaccesiblespblicamente.
class Klass
def kMethod()
end
end
k = Klass.new
k.methods[0..9]

#=> ["kMethod", "freeze", "nil?", "is_a?",


"class", "instance_variable_set",
"methods", "extend", "__send__", "instance_eval"]

k.methods.length

#=> 42

Porcierto,tantoricomordocpuedenserinstaladosmedianteaptget,perosiempreser
masmodernalaversinprocedentedegem.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag24/197actualizadoal06/01/13

Instalacin en Windows

ObtenemosRubydesdewww.rubyinstaller.org,proyectoargentinodelprximamente
legendario,LuisLavena.
Alltenemoslaopcindebajarnos
variasramasdedesarrollo.Entrminos
generales,yalafecha,setiembrede
2010,larama1.8esmascompatible,
entantoquela1.9esmasrpiday
proveevarioscambiosmuy
interesantesensuAPI.Retrocedahasta
loscomentariossobrelainstalacin
sobreUbuntuparavermasdetalles.
CuandocodeamosenRuby,loideales
hacerlodesdeelMSDOSconlas
variablesPATHapuntandoalacarpeta
c:\ruby<version>\bin

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag25/197actualizadoal06/01/13

SideseaactivarmanualmentelavariablePATH,lopuedehacerhaciendoclickderecho
sobreMiPc(Equipo)OpcionesAvanzadasVariablesdeEntorno.
Luegoabrauna(nueva)sesindeMSDOSyconfirmeescribiendo:
path

Sinembargo,RubyInstalleryaproveeunaccesodirectoatalefecto,quepuede
encontrarseenInicioProgramasRubyStartCommandPromptwithRuby

DevKit
Algunospasosnecesitarandeciertaslibrarasinstaladasenelsistemallamadas
DevelopmentKit.ParaellosbajamoselarchivoautoextraibleDevKittdm32x.x.x.sfx.exede
lapaginadeRubyInstaller,presenteenhttp://www.rubyinstaller.org/downloads/
Desinstalamoselcontenidoenalgunacarpeta,C:\DevKitporejemplo.

DeacuerdoalasinstruccionesdeinstalacindeDevKit,presentesen
https://github.com/oneclick/rubyinstaller/wiki/developmentkit,abrimoselMSDOS,vamos
hastalacarpetadondeseencuentraC:\DevKit,yejecutamosloscomandos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag26/197actualizadoal06/01/13

1.

ruby dk.rb init

2.

ruby dk.rb install

3.

gem install rdiscount platform=ruby

Esteltimopaso(3)sirveparachequearquelaslibrerashasidoinstalados(2)
correctamenteenelpathdeRuby(1),ennuestroejemplo,existenteenC:\Ruby187

Instalacin de GEM y Rails en Windows


RubyInstalleryatraeGEMincluido.Peroconvieneactualizarlo.Podemosestarparadosen
cualquiercarpetayejecutar:
gem update --system

Comoprimeramedida,antesdeinstalarRails,proveeremosalgunasgemasparagestionar
basesdedatos:MySQL,SQLiteyMSSQL.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag27/197actualizadoal06/01/13

SQLite bajo Windows


ParatenerunbuensoportedeSQLitebajoWindows,convieneentrara
http://www.sqlite.org/download.htmlybuscarlossiguientesarchivos:

EstosarchivosdebenserdescomprimidosenlacarpetabindedondehayainstaladoRuby,
ejemplo:C:\Ruby187\bin
Adems,convieneasimismoobtenerelplugindeSQLiteparaFirefoxquesedestacaunas
pginasmasadelante.

MySQL bajo Windows


MySQLpuedeserdescargadoparaWindowsdesdelapginaoficial,presenteen
www.mysql.org.Luegodelainstalacin,recuerdeinstalarunagemanecesaria:
gem install mysql2

UnabuenaideaesbuscarelarchivoLIBMYSQL.DLLensucarpetadeinstalacindeMySQL,
ycopiarloenc:\ruby<version>\bin
BajoWindowsSevende64bitspuedehacerfaltaseguiralgunospasosextras.Nuestro
referentesobreRubyyWindows,LuisLavena,tieneunmuyarticuloquetrataeltema,
presenteen
http://blog.mmediasys.com/2011/07/07/installingmysqlonwindows7x64andusingruby
withit/
Avecesquerrconstatarelestadodelasbasesexistentes.Misrecomendaciones:
a) HeidiSQL,presenteenwww.

heidisql

.com

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag28/197actualizadoal06/01/13

b) Herramientasoficialespresentesenwww.mysql.org:mysqlessentialsymysql
workbench.
Finalmente:noolvideabrirlossiguientespuertosenelFirewall:80,3000,3001,3002,8000,
3306

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag29/197actualizadoal06/01/13

Administradores para SQLite, Windows


ComoyamencionenelapartadodeLinux,posiblementenonecesiteherramientasextras
paraadministrarlabase.Peroquizsdeseesabersilosdatosseestnescribiendoylas
migracionescorriendo.Noobstanterecuerdequeloidealesutilizarparaestosmenesteresa
laconsolarails(railsconsole)olaconsoladelmotorsql(railsdbconsole).
Estemanager,curiosamenteunplugindeFirefox(6),eselmejordelosexistentes,ytambin
estdisponibleenFirefoxparaLinux.

https://addons.mozilla.org/es-ES/firefox/downloads/latest/5817

6 EnrealidadnoestanraroquequeciertospluginsparaFirefoxofrezcanmejoresfuncionalidadesque
programasclsicos:bastasoloobservarafireftpoafirebug.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag30/197actualizadoal06/01/13

Microsoft SQL Server

Paraconectarcontraestabasededatos,paseeunmomentopormisfavoritos:
http://delicious.com/karancho/mssql+rails

Ahora si: Rails 3 en Windows


Lossiguientespasosdeinstalacindeberanproveerunabasededependenciastalque
satisfagaaRails3.Muchocuidadoalcopiarlassiguienteslneas:
gem install -r rails

NosepreocupeporelerrorFilenotfoundlib.
Porcierto,siestecomandofalla,insistavariasveces:aveceslosservidoresseencuentran
saturados.Ahoracreamosunaaplicacincualquieraparalanzarlainstalacindegemas
quepordefectovengaconRails,concretamenteelinstaladorbundle,queactasobreel
archivoGemfile.
Paraunproyectosimple,conbasededatosSQLite:
rails new prueba

SipreferimosusarMySQL
rails new prueba --database=mysql

Esoestodo.Elproyectodeberaestarcreadoylistoparacomenzar.
Comonicocomentario,ysiprestaatencin,durantelacreacindelproyecto,seha
disparadounscriptllamadobundle,queseencargaunpocoalamaneradeMaven,de
bajarlaslibreriasnecesariasparaqueelproyectofuncione.Siusteddebieraincluiralguna
libreraextra,debehacerlodentrodelarchivoGemfile.
Ejemplo:sihubiramossolicitadosoportedeMySQL,probablementeenGemfilefigureuna
lnea:

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag31/197actualizadoal06/01/13

gem 'mysql2'

Luegoqueesearchivoesalterado,sedebecorrermanualmente:
bundle install

SihemosescogidoMySQL,debemoseditarloscampospasswordde
config/database.yml,antesquecomencemosconlasmigraciones.

Unavezterminadalaejecucindebundle,reviselaversininstalada:
rails -v

Comprobar todo
Inclusounatecnologatanfiablecomolaaqupresentada,puedefallarenWindows,un
sistemaoperativoqueavecessuelecomportarsecomouncampominadopara

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag32/197actualizadoal06/01/13

programadores.
Paraevitarfuturosproblemas,prueberealizarlassiguientesaccionesenlarazdela
aplicacin:
rails generate scaffold Student name:string age:integer registered:boolean
rake db:create:all
rake db:migrate
rails server

Luego,carguelasdirecciones:

http://localhost:3000/rails/info/properties

http://localhost:3000/students

Sialgofalladurantealgnpaso:

Asegresedehaberintentadovariasveceslamismalnea.GEMnoproveealafecha
ensucapadeaplicacin,opcionesparadecidirsobreunexcesodecargaenel
repositoriorubygems.org.

CuidadocuandocopieypeguedesdelaversindeestelibroenPDF.Aveces
caracteresenunformatosepeganbinariamentedeotraformaeneldestino.Porsi
acaso:transcribapalabraapalabralasrdenesaquexpuestas.Ademsesbueno
paralamemoria.

SiusaMySQL,cadavezquecambielacontraseaenconfig/database.yml,reinicie
Webrick(laordenrailsserver)medianteCtrl+C.

Sipersisteelmismomensajedeerror,entoncesserelmomentoderevisarinformesde
ltimomomentoen

http://guides.rails.info

YlosrecomendadosdeLuisLavena,elgeniocreadordeRubyInstaller:

http://github.com/oneclick/rubyinstaller/wiki/Tutorials

http://pragmaticstudio.com/blog/2010/9/23/installrailsrubywindows

http://skim.la/2010/08/21/rails3rconwindowsusingrubyinstaller192/

Porsupuesto,nodejeacudiraalgunasdelasexcelenteslistasdecorreos

Enespaol:

http://lists.simplelogica.net/mailman/listinfo/rores

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag33/197actualizadoal06/01/13

http://lista.rubyargentina.com.ar/listinfo.cgi/rubyrubyargentina.com.ar

http://librelist.com/browser/rubyenviarcorreoarubysur@librelist.comyesperar
Reply

https://groups.google.com/forum/?fromgroups#!forum/mendozarb

Eninglesycomocuriosidad,parachicas!http://railsgirls.com

Finalmente,puedemantenerseactualizadoacudiendoamisvnculosbookmarkeadosen

http://del.icio.us/karancho/rails3

http://del.icio.us/karancho/rails

http://del.icio.us/karancho/ruby

http://del.icio.us/karancho/tutoriales

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag34/197actualizadoal06/01/13

Editores
[IDEs] vs [Editores simples + IRB]
CoincidotantoconFabioAkita,comoconMichaelHartl,enquelosgrandesIDEsparaRuby
molestanmasdeloqueayudan(7).SiustedprovienedeJavao.NET,inmediatamente
buscarautocompletado,instrospeccin,yvariasfuncionesquebajoRubynotienen
muchautilidad.
Laraznseencuentraenquelamayoradelasfuncionesquenecesite,yaestnincluidas
enlalibrerabase.Ynosonmuchas.Alcabodeunashoras,notarquetodoeltiempoha
estadollamandoalosmismosmtodos.
Loidealesutilizar"lospolgonosdetiro":irbparaRuby,yrailsconsoleparaRails.Enellos
puedeprobarpequeostrozosdecdigo,yluegopegarlosenalgneditorsimple.
Supongamosquequeremosaveriguartodasaquellascosasquepodemoshacerleauna
cadena.Vamosprimeroaconsultaralirb
gnome-terminal, o mejor an: terminator
Inicio Programas Ruby Start Command Prompt with Ruby

Luego,llamamosairb
irb
irb(main):001:0> p = "pepe"
=> "pepe"

Averiguamosquepodemoshacerconp:
irb(main):002:0> p.methods
=> ["upcase!", "zip", "find_index", "between?", "to_f", "minmax", "lines", "sub", "methods",
"send", "replace", "empty?", "group_by", "squeeze", "crypt", "gsub!", "taint", "to_enum",
"instance_variable_defined?", "match", "downcase!", "take", "find_all", "min_by", "bytes",
"entries", "gsub", "singleton_methods", "instance_eval", "to_str", "first", "chop!", "enum_for",
"intern", "nil?", "succ", "capitalize!", "take_while", "select", "max_by", "chars", "tr!",
"protected_methods", "instance_exec", "sort", "chop", "tainted?", "dump", "include?", "untaint",
"each_slice", "instance_of?", "chomp!", "swapcase!", "drop", "equal?", "reject", "hex",
"minmax_by", "sum", "hash", "private_methods", "all?", "tr_s!", "sort_by", "chomp", "upcase",
"start_with?", "unpack", "succ!", "enum_slice", "kind_of?", "strip!", "freeze", "drop_while",
"eql?", "next", "collect", "oct", "id", "slice", "casecmp", "grep", "strip", "any?", "delete!",
"public_methods", "end_with?", "downcase", "%", "is_a?", "scan", "lstrip!", "each_cons", "cycle",

http://www.akitaonrails.com/2009/01/13/thebestenvironmentforrailsonwindows
http://railstutorial.org/book#sec:development_tools

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag35/197actualizadoal06/01/13
"map", "member?", "tap", "type", "*", "split", "insert", "each_with_index", "+", "count", "lstrip",
"one?", "squeeze!", "instance_variables", "__id__", "frozen?", "capitalize", "next!", "each_line",
"rstrip!", "to_a", "enum_cons", "ljust", "respond_to?", "upto", "display", "each", "inject", "tr",
"method", "slice!", "class", "reverse", "length", "enum_with_index", "rpartition", "rstrip", "<=>",
"none?", "instance_variable_get", "find", "==", "swapcase", "__send__", "===", "min", "each_byte",
"extend", "to_s", "rjust", "index", ">=", "size", "reduce", "tr_s", "<=", "clone", "reverse_each",
"to_sym", "bytesize", "=~", "instance_variable_set", "<", "detect", "max", "each_char", ">",
"to_i", "center", "inspect", "[]", "reverse!", "rindex", "partition", "delete", "[]=", "concat",
"sub!", "dup", "object_id", "<<"]

Vaya,asquepodemosCapitalizarlaprimerletra?
irb(main):003:0> p.capitalize!
=> "Pepe"

Ahoras,sabiendoqueesasporcionesdecdigosonseguras,nosvamosaalgneditory
pegamosesalnea.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag36/197actualizadoal06/01/13

Editores
Seofrecenaqueditoresquepueden,ensumayora,encontrarseconversionesparalostres
sistemasoperativosmasusados,Linux,MacOS/XyWindows.

Vim (Windows y Linux)

Vimdebeserunodelosmejoresymasusadoseditoresenlahistoriadelaprogramacin.Sin
embargo,requiereantesdeserusado,buscaralgnbrevetutorialenInternet.Esdecir,no
esaptoparaimpacientes.Adems,alsermuyliviano,eselpreferidodelossysadmins,
quieneslousanamenudocuandoseconectanremotosalservidorvaconexionesssh,
limpio,sinbarrasnibotones,ymuyextensible.QuienseacostumbraaVim,tiendeaverlos
demsIDEcomosifuerantravestisllenosderopaencima.Portalrazneselidealparalos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag37/197actualizadoal06/01/13

codemonkeys,geeks,aspirantesahackers,dueosdemaquinaslimitadas,osimplemente
autodidactas.
Vimpuedeserllamadodesdeconsola/msdosmedianteelcomandovim(austero,rpido,
sinmen),ocomogvim(conbarradeiconos,mas"amable").

Vim en Windows
Descargabledesdewww.vim.org.Enelasistentedeinstalacin,recuerdeactivarlaopcin
Full,afindepoderlanzarlodesdeelpropioMSDOS.
LoprimeroquedesagradaalosusuariosdeVimparaWindowseslamodalidadInsercin:
sedebepresionar[i] paracomenzaraintroducirtexto.Paraevitarestamodalidad,se
sugierelanzarvimmedianteeliconoVimEasy

Vim en Ubuntu Linux

sudo apt-get install vim vim-gnome vim-rails

Selollamadesdeterminalcomo"gvim"ocomo"vim".

Ayuda!
Aqulesdejounaseriedevnculosparadominarestemagnficoeditor:
http://delicious.com/karancho/vim+tutoriales
Adems,unatarjetadereferenciarpidaquepuedeserestampadaenunataza
http://bunker.org.ar/incubadora
(LavendduranteuntiempoenMercadolibreconciertoxito,hastaquedecidliberarla).

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag38/197actualizadoal06/01/13

Vimmate (solo Linux)


EselmismoVimdesiempre,peroconvariosesteroidesparatrabajarconframeworks.Es
muyagradableyproveealgunascaractersticasmuyinteresantes,propiasdeIDEmas

grandes,talescomoautocompletado,folding,coloreodesintaxis,etc.Paraactivarletodas
lasopciones,revisarlassiguientesnotas:
http://bunkerblog.blogspot.com/search/label/vim
Parainstalarlohacefaltarcumplirunospasos:

sudo apt-get install libgtk2-ruby vim-gnome libglib2-ruby

sudo gem1.8 install VimMate

vim-rails

Parausarlo,selodebeejecutarsobrelarazdelaaplicacin.Porejemplo:
/home/sergio/ProyectoRails $ vimmate

Vim con Esteroides (Linux y Windows)


Avanzado:nuevamente,FabioAkitamuestracomoaprovecharexuberantctagspara
agregarlevariascomodidadesalviejoyconfiableVim.Serecomiendaleerlanotapresente
enhttp://bunkerblog.blogspot.com/2010/03/yvimconocioakita.html

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag39/197actualizadoal06/01/13

Sublime (Windows y Linux)

MichaelHart,elautordelexcelenteRubyonRailsTutorial(www.railstutorial.com)
recomiendauneditorparaaquellosusuariosdeWindowsquenodeseenlidiarconel"Unix
Style"deVim.SetratadeSublimeText(www.sublimetext.com),uneditormuyagradable,
queprometemucho.Noposeetodavaautocompletado,peromuchossnippetsalestilode
Texmate(Mac).
Sibiensoloselodebedescomprimirycomenzarausar,Michaelhaescritouninteresante
tutorialparahacerlomasuserfriendyen
https://github.com/mhartl/rails_tutorial_sublime_text

RedCar (Linux y Windows)


Eselnuevofavoritodelaslistasdecorreo.Libre,gratis,multiplataforma,liviano,einstalable
simplementecomounagema.Soportaautocompletado,traealgunossnippets,yeselque

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag40/197actualizadoal06/01/13

traemasthemesoscuros.Lasinstruccionesparainstalarlopuedenencontrarseen
http://wiki.github.com/danlucraft/redcar/installation
lascuales,encuentasresumidas,secomponendelassiguientesinstrucciones:

sudo apt-get

install libzip-ruby1.8

sudo gem1.8 install -V redcar && redcar install

gem install -V redcar


redcar install

Elinstaladornofabricaunaentradaenelmen,demodoquetendremosquehacerlo
nosotros,ollamarlosimplementedesdelaterminal,paradosenlarazdelproyecto,
mediante
redcar . (si,conelpuntoallado:significacarpetaactual)

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag41/197actualizadoal06/01/13

IDEs
Hastaahoravenamoscomentandosimpleseditores.Acontinuacinsepresentanentornos
mascompletos,capacesdegestionarservidores,debuggearyasistiraprogramadoresmas
experimentados.Noserecomiendasuusoalosnovatos,yaqueretrasaranintilmenteel
aprendizajeinicialdeRuby.

AptanaStudio(LinuxyWindows)

LosfanticosdeEclipsesealegrarndeconoceresteforkparaRuby.Dehecho,se
encuentraamediocaminoentreuneditoryunIDE,yaqueposeevariacaractersticas
interesantes.

Paraempezar,proveesoporteparalenguajescomo:PHP,Python,Ruby,CSS,Ajax,HTMLy
AdobeAIR.Adems,tienelaposibilidaddeincluircomplementosparanuevoslenguajesy
funcionalidades.Compatibleconaproximadamente1000extensiones.Asaber:

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag42/197actualizadoal06/01/13

DebugintegradoconFirefox,comodetalleinteresante,yaqueRubytraeun
debuggerpropio,quepuedeustedconsultarenelApndiceA.

AsistentedecdigoparaHTMLyJavascript.

LibrerasAjax(jQuery,Prototype,Scriptaculous,ExtJS,Dojo,YUIySpryentreotras).

ConexinvaFTP,SFTP,FTPS,ysnippetsparaHeroku,muytilparaagilizardeploys.

IDEparaGITintegrado,sielprogramadetectaungitinit.oungitcloneprevio.

Impresionantecoleccindesnippetspararealizartareascomunes(vercaptura).

Netbeans (Linux y Windows)


Netbeansesunentornomuycompleto,repletodeatajosyopciones.Consumebastante
RAM,1GB~2GBalmenosparatrabajarcmodamente.Eselnicodelconjuntoque
puedeserconseguidoenespaol,consuelodenovatos.
Lomalo:alserignoradoporpartedelacomunidaddeOracle,estacompaa,menos
generosaquelaantaoSunMicrosystem,hadejadooficialmentedesoportarRubydesde
laversin7.Unapena,yaquesenotaunverdaderoesfuerzoporpartedelacomunidadde
Netbeanshastalaversin6.9.
Sinembargociertosdetallescomoloslargostiemposdedespliegue,laausenciade
fastdebuggerenlaversinWindows,yotrosaspectos,hacequelarecomendacindeun
IDEintegradoygratuitopaseporotrasopciones,comoAptanaStudio.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag43/197actualizadoal06/01/13

Rubymine (Linux y Windows)


Esuneditorcomercial,aunqueaunexcelenteprecio:u$s100.
Poseeelmejorautocompletadodelconjunto,sugerenciasdeoptimizacin,deteccinde
sintaxis,impresionantemanejodeCSS,einclusoungeneradordediagramasderelaciones
has_many,belongs_to,etc.Tambinposeevariasayudasparaaquellosqueusantestear
antesdecodificar(TestDataDriven),medianterspec,cucumber,yotros.
Unprofesionalsesentirmuyagustoconestaherramienta,entantoqueunnovatopodra
sentirseintimidadoporlacantidaddeopciones.
Requieredealmenos512MB~1GBdeRAMparatrabajarcmodamente.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag44/197actualizadoal06/01/13

Otras herramientas tiles


Dadme un punto de apoyo y mover el mundo
Arquimedes
Consola / Terminal / MSDOS
SibienUbuntuyatraelaexcelentegnometerminal,laexperienciadeusopuede
mejorarseagregandoaTerminator,unaconsolaconcapacidaddedividirelespacioen
variasconsolas.Deestamanera,sepuedecrearunIDEamedidaqueprogresalasesinde
trabajo.Cuandoqueremosteneralgoalavistaensimultneo,simplementedividimos:

Enlacapturapuedeobservarseunaedicindelasvistas(vim),unespacioenelquese
esttesteando(raketest:units),unaporcinquevuelcaloslogsdelserver(mediantetailf),
ylaconsoladeRails(railsconsole)probandotrozosdecdigo.
Exterminatorsepuedeobtenerdirectamentedesdelosrepositorios,mediante

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag45/197actualizadoal06/01/13

sudo apt-get install terminator

EnWindows,puestoquevaapasar
bastantetiempoconlanarizenel
SmbolodeSistema,o"MSDOS",sera
convenientequeobtengaunreemplazo
mascmodo,ubicadoen
http://sourceforge.net/projects/console/

Windows / Linux: Firebug

FirebugesunpluginparaFirefoxquepermiteexaminarlaspginasquevamosrecibiendo
enelnavegador.Sialgonoandabieneneldiseo,simplementepulsamosF12,yel
navegadornospermitirrevisarfcilmentezonas<div>,etiquetas,sucorrespondenciaen
lasplantillaCSS,susenlacesjavascript,etc.Presenteenhttps://addons.mozilla.org/en
US/firefox/addon/1843

Windows / Linux: Web Developer


Esteplugin,acasopopularizadoporlagenial@raymichaysusmagnficostutorialesde

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag46/197actualizadoal06/01/13

XHTML(8),permiteinterveniraligualqueFirebugeneldiseodelapgina,inspeccionar
diseosajenos,obtenerinformacinvaliosa,einclusocambiarlasCSSentiempode
ejecucin.Estoesmuytilparaprobaryafinardetallesdurantelosmaquetados.

8 http://www.trazosweb.com/2009/09/16/comoconvertirunpsdaxhtmlycss/

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag47/197actualizadoal06/01/13

Captulo2
Losbuenosprogramadoressepasanlavidaprogramando.
Losexcelentesprogramadores,sabenquecopiaryquepegar.
EricRaymond

Captulo 2: Un poco de Ruby


Abraunaterminal/consola(Ubuntu)oInicioProgramasRubyStartCommand
PromptwithRubyenWindows.
VerifiquelapresenciadeRubyescribiendo
ruby -v

Paralosejemplosaquvertidos,cualquierRubyconversinigualosuperiora1.8.7debera
bastar.

IRB... o "el polgono de tiro"


LlamealInterpreteInteractivodeRuby.Servirparaintroducirnosunpocoenellenguajesin
necesidaddeguardararchivos.
Escribalaspalabrasennegrilla:
irb
Welcome to interactive ruby!
"saludos".length
=> 7
"saludos".methods
=> ... (muchos metodos)
"saludos".reverse.capitalize
=> "Sodulas"

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag48/197actualizadoal06/01/13

3.times do
puts "holas "
end
holas
holas
holas
[3,1,7,0].sort.reverse
=> [7, 3, 1, 0]

For vs Iterar
for i in 1973..2008
puts i
end
1973
...
2008
1973.upto(2008) do | anio |
puts anio
break if anio == 2007
end
1973
...
2007

Fechas
require 'date'
=> true

LlamamosycargamosunMdulodelalibrerabase.Losmdulossoncoleccionesde
mtodos,quenorequierendeinstanciacin.
Time::now.year

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag49/197actualizadoal06/01/13

=> 2007
sergio = Date.new(1973,2,26)
Time::now.year - sergio.year
=> 34
for i in sergio.year..2008
puts i
end
1973 .......... 2008
cristian = Date.new(1973,10,26)
cristian - sergio
=> Rational(242, 1)
cristian.month - sergio.month
=> 8

Arreglos
Nota:siobservaelejemplo,notarquelosarregloso"arrays"puedencontenertodaclase
deelementos:cadenas,enteros,objetos,otrosarreglos...

arreglo=["1",2,0.3],[4,5,6]
=> [["1", 2, 0.3], [4, 5, 6]]

Esdecir
arreglo
Columna 0

Columna 1

Columna 2

Fila 0

"1"

0,3

Fila 1

arreglo[1][1]
=> 5

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag50/197actualizadoal06/01/13

lenguajes = ['Python', 'Java', 'Ruby']


lenguajes[1]
=> "Java"
lenguajes[0..2]
=> ["Java", "Python", "Ruby"]
lenguajes[0,2]
=> ["Java", "Python"]
for i in lenguajes
puts i
end
=> ["Java", "Python", "Ruby"]
lenguajes << 'PHP'
=> ["Python", "Java", "Ruby", "PHP"]

Bloques vs For
lenguajes = ['Python', 'Java', 'Ruby']
lenguajes.each do |lenguaje|
puts 'Me gusta ' + lenguaje + '!'
end
=> Me gusta Python
=> Me gusta Java
=> Me gusta Ruby
for i in lenguajes
puts "me gusta " + i
end
=> Me gusta Python
=> Me gusta Java
=> Me gusta Ruby

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag51/197actualizadoal06/01/13

Diccionarios (en rigor: Hash)


Losdiccionariossonunaespeciedearreglosmixeadosconndicesmanuales,comoclave
paraencontraruncontenido.
Creamosunhash
legajos = { "uno" => "Alonso" , "dos" => "Pacifico" , "tres" => "Ramirez" }

Recuperamosdatosdelhash
legajos["dos"]
=> Pacifico

Creamosotrohash
diccionario = { 'uno' => 1 , 'dos' => 2 }
=> {"uno"=>1, "dos"=>2}

Leagregamoselementos
diccionario['tres'] = 3
=> 3

Inspeccionamoselobjeto
diccionario
=> {"uno"=>1, "tres"=>3, "dos"=>2}

Lepasamosunaclave('uno')alobjeto,paracambiaralcontenido
diccionario['uno']='otra cosa'
=> "otra cosa"

Inspeccionamosnuevamente
diccionario
=> {"uno"=>"otra cosa", "tres"=>3, "dos"=>2}

Smbolos como ndices


Comondicedeloshashessepuedenusarunasexpresionesllamadassmbolos,lascuales
vienenaserunespeciedeetiqueta;unasuertedeconstanteliteralquenoposee

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag52/197actualizadoal06/01/13

contenido.
Creamosunhash
persona = Hash.new

Lollenamos
persona[:nombre] = 'Pedro'
persona[:apellido] = 'Picapiedra'

Otambincreamosyllenamosenunsolopaso:
persona = {:nombre => 'Pedro', :apellido => 'Picapiedra'}

Volcamosalgunosdevaloresalmacenados
puts persona[:nombre]
=> Pedro

Modelo try -- catch - finally


Nopodafaltaralgnmecanismodecatch
F = File.open("archivo")
begin
#...
rescue
#...
else
puts "No hubo errores"
ensure
if not f.nil?
f.close
end

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag53/197actualizadoal06/01/13

Acceso a bases de datos sin uso de ActiveRecord o Rails... todava


Esteejemploestilparacuandonecesitamoshaceralgunasimpleaplicacinsin
necesidaddedesplegarelframeworkRails.

EnLinuxrequieredeagregarunaslibreras:
sudo apt-get install libmysql-ruby libdbd-mysql-ruby

EnWindows,laslibrerasyaestnincluidas.
Cuidadocuandocopieypegueestosejemplos.

Acceso a MySQL

require 'dbi'
dbh = DBI.connect('DBI:Mysql:inventario', 'root', '')
sth = dbh.prepare('select * from material')
sth.execute
while row=sth.fetch do
p row
end
sth.finish

Acceso a MSSQL
require 'dbi'
DB = "Provider=SQLOLEDB.1;Password=coliflor;Persist Security Info=True;User
ID=sa;Initial Catalog=eith;Data Source=192.168.1.118"
sql = " select * from Alumno"
DBI.connect("DBI:ODBC:#{DB}") do | dbh |
dbh.select_all( sql ) do |row|

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag54/197actualizadoal06/01/13

puts row[0] # primer campo


puts row[1] # segundo campo
end
end

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag55/197actualizadoal06/01/13

Bindings grficos
SepuedeprogramarventanasenRuby?Porsupuesto:Rubypuedeutilizardiversostoolkits
grficos:

Tk

QT

wxRuby

CocoaRuby(ObjetiveC,paraMac)

GTK

Shoes

Unodelosbindingsmasavanzados,estables,multiplataformaymejordocumentada,es
wxRuby.Solorequieretenerlaslibreraswxrubyinstaladas:verseccindeinstalacin.

Veamosunejemplo:
Primero:dondeestninstaladaslasgemas?loconsultocon:

gem environment

Elcualanunciarquelasgemasseencuentraninstaladasenalgoparecidoa
/usr/lib/ruby/gems/1.8/gems

Sientramosaestacarpeta,ymiramosunpocomasadentro,encontraremosunacarpeta
wxruby-2.0.0-x86-linux

Convariosejemplosadentro:
/samples/

Paraprobarlosejemplos,concdigofuenteytodo,accedemosalacarpetamediante
ConsolaoMSDOS,ycorremos:

ruby bigdemo/bigdemo.rb

ruby bigdemo\bigdemo.rb

Aquseabrirnunaseriedeejemplosmuybiendocumentados.Podemosejecutarestos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag56/197actualizadoal06/01/13

ejemplos,copiaryadaptarelcdigofuentedelosprogramasanuestrogusto.

Curiosidad:observarcomowxRubyimplementaloselementospropiosdecadasistema
operativo,accediendodirectamentealaAPI
DentrodelacategoraCommonsDialogs,sepuedeobservarloselementos

wxColourDialog

wxFileDialog

Windows

Linux

YenOSX?Niidea,necesitaraunacomputadoraMac.Porsideseansaberlo...mi
cumpleaosesel26defebrero.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag57/197actualizadoal06/01/13

Mdulos
Definicin:Mdulo:coleccindemtodos,quenorequierendeinstanciacin.Lohabamos
usadoenelejemplo

irb

Time::now.year

Sepuedecrearmdulos?Porsupuesto!Cumplenlafuncindelasfuncionesenla
programacinestructurada.
#creamos un vector con cadenas
claves = ['python', 'java', 'ruby']
#solo por curiosidad, le agregamos un elemento
claves.push('eiffel')

def encriptar(v)
#solo por curiosidad, ordenamos el vector enviado
v.sort
#creamos un nuevo vector
vv = []
#Representamos cada (each) elemento del vector con la variable i
v.each do |i|
#Ponemos el elemento en Mayscula al principio
i = i.capitalize
#Lo damos vuelta
i = i.reverse
#Lo agregamos al vector nuevo
vv.push i
end

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag58/197actualizadoal06/01/13

return vv
end
#Probemos como qued el mdulo:
claves_encriptadas = encriptar(claves)
puts claves_encriptadas

Respuesta:
=> nohtyP
=> avaJ
=> ybuR
=> leffiE

Clases
Ejemplificarelusodeclases,medianteunjuegoRPG.Elsiguienteprogramaguardeloen
unarchivollamadojuego.rb,yejecuteloconelcomandoruby:
class Personaje
#Atributos accesores (getters y setters pero con estilo)
#attr_reader
#attr_writer
#attr_accesor
attr_reader :nombre, :fuerza, :magia
@nombre
@clase
@fuerza
@magia
#constructor
def initialize(n,c,f,m)
@nombre = n
@clase = c
@fuerza = f

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag59/197actualizadoal06/01/13

@magia = m
end
end
class Juego
def initialize(p1,p2)
@personaje1 = p1
@personaje2 = p2
end

def combate
if (@personaje1.fuerza + @personaje1.magia) <
@personaje2.magia)

(@personaje2.fuerza +

puts "Gana " + @personaje2.nombre


else
puts "Gana " + @personaje1.nombre
end
end
end
#comienza juego
#escribo "main" para que se sienta como en java casa :)
#instanciamos personajes
arturo = Personaje.new("Arturo","Caballero",10,5)
smaugh = Personaje.new("Smaugh","Dragon",50,40)
#instanciamos un juego nuevo
SeniorDeLosLadrillos = Juego.new(arturo,smaugh)
#Let's figth! (parafraseando a Mortal Kombat ;)
SeniorDeLosLadrillos.combate

Herencia
Laherenciaesmuysimple.Utilizaeloperador<

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag60/197actualizadoal06/01/13

class JuegoV2 < Juego


end

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag61/197actualizadoal06/01/13

Clases temporales
Sinecesitamosmomentneamenteunmtododeunaclase,ynadamas,podemos
instanciarunaclasesinocuparnosdepensarenunnombre,nitenerquedestruirlomas
tarde.
Juego.new(arturo,smaugh).combat

Entrada por lnea de comandos


Posiblementedeseeprobarpequeostrozosdecdigoconinteractividaddelusuario,sin
entraralacomplejidaddebindingsgrficoscomoelmencionadowxRuby,niaccesos
desdeWeb.Elamigablegetsnospermiteleerentradasdeteclado.Pruebeelsiguiente
ejemploenunarchivoconextensin.rb,omascmodamente,enelirb:
puts "Ingrese un numero: "
STDOUT.flush
primerNumero = gets.chomp
puts "Ingrese otro numero: "
STDOUT.flush
segundoNumero = gets.chomp
prom = primerNumero.to_i+segundoNumero.to_i
puts "El promedio de los dos numeros es: ", prom /2

CuidadoconlosacentosusandoirbenWindows

Mtodos Bang!
Hayocasionesenqueporcadamtodo,encontramosunosimilarterminadoconun
smbolo!
Estossmbolosmodificanelobjetoquelosllama.Useelcomandoirbparaprobarlas
siguientesinstrucciones:
mensaje = 'Die die, piggy, die die!'
copia = mensaje.upcase
puts mensaje

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag62/197actualizadoal06/01/13

>> Die die, piggy, die die!


puts copia
>> DIE DIE, PIGGY, DIE DIE!

Encambiocon!
mensaje = 'Die die, piggy, die die!'
copia = mensaje.upcase!
puts mensaje
>> DIE DIE, PIGGY, DIE DIE!
puts copia
>> DIE DIE, PIGGY, DIE DIE!

<-------------------- (!)

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag63/197actualizadoal06/01/13

Captulo3
Captulo 3: Frameworks
Habamoshabladodurantelaintroduccin,respectodelaconvenienciadeutilizar
frameworksparaconstruir,masquepaginaswebdinmicas,aplicacionesWeb2.0.
Sihacemosunresumendetodomisermninicial,unframeworkesunsoftwarequeayudaa
construirotrossoftwares.
Enmaspalabras,esungranaplicacinincompleta,queseconfigurayconectansus
partes.Ysiempreobligaaseguirbuenaspracticasdeconstruccindesoftware.
Tpicamente,unframeworkpuedeincluirsoportedeprogramas,bibliotecasyunlenguaje
descripting,entreotrossoftwares,paraayudaradesarrollaryunirlosdiferentes
componentesdeunproyecto.

Algunas caractersticas del framework Rails

Proveesalidaso"vistas"nosoloenHTML:tambingeneraJSyXML.Estoesmuytil
cuandoquienentraanuestraaplicacinnoesunapersona,sinootraaplicacin.
Ejemplo:formulariosFlashconstruidosenMXMLmedianteelsimpticoFlexBuilder.

Poseeuninteligentemapeodeclasesmediante"Migraciones".Lasmigraciones
permitenmanteneractualizadounarchivo,elschema.rb,queutilizaRailscomo
mapaparaaccederalastablas.

SeadscribeaunmovimientodenominadoDRYNoRepitas(Don'tRepeatYourself).
Porejemplo,sienelmodelodeclaramosque"elcamponombrenopuedeestar
repetido",estoimpedir(ygenerarlavalidacinpornosotros)larepitenciadel
nombredesdecualquierformulario,seaesteunnew,unedit,etc.

Railstodoeltiemporealizaanotacionesdebitcora,ologgingdetransacciones,
paraverquepuedeestarfuncionandomal.

Unaspectointeresante,esqueparaevitarlaslargasconfiguraciones,mapeos
manualesdeclases,tablasendicesquemareanatodoslosprincipiantesdeStruts,
Springyotrosframeworks,Railsprefiereconveniro"acordar"primero.Estosellama
"ConvencinsobreConfiguracin".Esdecir,sirespetamoslosnombresqueusarails

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag64/197actualizadoal06/01/13

parasustablas(plural),clases(ensingular),ndices(soloid),ndicesajenos(_id),etc,
lrealizarunmontndetrabajoautomticopornosotros.

ConRailsesfcilparametrizarURLfcilesderecordar,alestilo:

http://localhost:3000/tabla/edit/2

http://libros.com/revisiones/list/20120811

Compaginacin:Railsmanejademaneramuylimpiayeleganteeldiseogeneral,a
travsdelayouts,loscualesveremosmasadelante.Adisframes,plantillas
Dreamweaverycosasraras!

TodoeltiempoRailsgestionainstanciasdeDesarrollo,PruebayProduccin,incluso
enelmismoservidor.

Frameworks MVC
Unclsicoproblemadelaprogramacindepaginasdinmicaseslamezclaentrela
lgica,lasconexiones,elSQL,lapresentacin,elmanejodelassesiones,etc.
Elcdigoresultanteesconfuso,difcildeleer,eincluso,deexplicar.Inclusocuandoel
cdigoespropio,alcabodeunosmeses,masdeunprogramadorsearrancaloscabellos,
mientraspiensa
"Quetenaenlacabezacuandoescribesto...?
Enlos80seideunmtodoparasepararlaspartesesencialesdelaaplicacin,llamado
MVC,correspondienteaModeloVistaControlador.
UsenonoRails,quizslomasimportantequesellevarandeestalectura,eslanocinde
MVC.Muchosframeworksposeensus
propiasimplementaciones.Por
mencionaralgunos:

Java:J2EE,Struts,Swing,...

Python:Django,TurboGears,...

PHP:QCodo,Smarty,phpMVC,
Trax,Symfony,

ASP.NET,WindowsForm,

Lagrandiferencia,esquelos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag65/197actualizadoal06/01/13

programadoresdeRailsseacordaronqueMVCdebasersimple.
Veamosunejemplobsico

Navegador

Solicitud (URL)
routes.rb dice: /companies/4/show

Controlador de companies
Accin 1: new
Accin 2: show
@company = Company.find(4)

SWF

Flex

HTML
CSS
JS

XML
Json
YML

Modelo
(ActiveRecord)

select * from companies, where


bla bla (a quien le importa?)

Vista de Accin 1
<%= @company.name %>
<%= @company.cuit %>

De preferencia... no

SQL / NOSQL

1) Enelnavegadorsehaceclickenlacompaa#4,actionshow
2) routes.rbdescomponelasolicitud,ydecidecontrolador/accinarealizar.Eneste
caso,companies/show.LaURLpuedeincluirotrosdatostiles,talescomoel#id
3) Enlaaccinsetomanladecisiones,talescomolaconvenienciaonodebuscarla
informacinsolicitada.
Lapeticindedatosserealizaalmodelo,medianteinstruccionesdetipoORM
(ObjectRelationalMap).RailsproveeunodelosmejoresORM,llamadoActiveRecord.
Ejemplo:
@company = Company.find(4)

Desdeelcontroladorsepodrapediralmodeloqueseleproporcionenotrascosas
queActiveRecordnorealizeautomticamente.Ejemplo:
@morosos = Company.buscar_activas

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag66/197actualizadoal06/01/13

Porsupuesto,enesecaso,hayqueaclararelmtodobuscar_activasenelmodelo
Company.
Lasaccionessuelentenervistasasociadas.Enesteejemplo:show.html.erb
4) Enelmodelohayrutinasfindcapacesdeencontrarloquenecesitamos.
ActiveRecordhacetodoloposibleparaencargarsedelaparte"dura",esdecir
inyectarcomplejasinstruccionesSQL(oinclusoNOSQL).
5) Laideadelavistaesmantenerlalimpiaparaconcentrarseeneldiseo.Masdeun
diseadorpuedeespantarsecuandolepedimosquemodifiqueunapaginaescrita
enPHP,ynodejadetenerrazn.Lasdecisionesquedanparaelcontrolador.Las
bsquedas,paraelmodelo.
Porcierto,podemosemitirdatosnosoloenelconvencionalHTML,sinotambinen
textoplano,JSON,YML,oXML.Otrascapasytecnologas,talescomoFlexoAIR
puedenaprovecharestasfunciones.

Algo ms respecto del Modelo


ActiveRecord,elORMdeRails,secomunicaconlabaseydevuelveacambioobjetosque
representanregistrosocoleccionesderegistros.Losatributosdelobjetoobtenidosonlos
campos.
Supongamosquevenamosdesarrollando,enSQLite.SienSQLitequeremossabercuantas
empresasseencuentranactivas,usamos
SELECT * FROM companies WHERE (active='t')

MientrasqueenMySQL,lamismaconsulta,serepresentacomo
SELECT * FROM companies WHERE active = true;

Enunproyecto,cambiaramitaddeldesarrollodemotorSQLpuedeserunasolicitudmuy
cruel(9).Rails,medianteActiveRecord,semantieneporencimadeesasnecesidadesynos
abstraedelosdetalles:
Company.where(:active => true)

Aunquesinecesitamosalgomuyespecfico,estamosapurados,siemprepodemospasar
9 http://picandocodigo.net/2009/videohugadeveloperabrazaaundesarrollador

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag67/197actualizadoal06/01/13

porcionespersonalizadasaActiveRecord:
Company.where(" active = 't' ")

Captulo4
Captulo 4: Bienvenidos al Tren
Enestaparteintentaremosrealizar,pasoapaso,unaaplicacinconRails.
Porelcamino,seharusodealgunasgemasytrucospropiosdeesteframework.Los
ejemplosaparecenenWindowssoloparahacerlesperderelmiedoalosusuariosdeeste
SO,alavezquesedemostrarlaslevesdiferenciasdetrabajarconLinux.

Crear una Aplicacin


AbrirunaterminaloelSmbolode
Sistema,yejecuteelsiguiente
comando:
rails new demo

Estaordenfabricaelesqueletodela
aplicacinRails.Ademas,
preconfiguraelentornoparatrabajar
conunabasededatosllamada
SQLite.
Sideseamosencambiotrabajarconotrasbasededatos,talcomoMySQL,Oracle,
PostgreSQL,IBMDB2,etc,podemospreconfiguraralgunosarchivosescribiendo,porejemplo
rails new demo --database=mysql
Mediantealgneditor,abralosarchivosdelacarpetademo,yobservelascarpetas
generadas.Tambinobserveatentamentelasbasesdefinidasenconfig/databases.yml.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag68/197actualizadoal06/01/13

Volveremosaestosarchivosmasadelante.ParacorrerelserverWebdepruebas:
cd demo
rails server

rails server

Estecomandocorreunpequeoserverweb,escritoenRuby,pararealizarpruebas.
Cargueladireccinhttp://localhost:3000enelnavegador.

Siobtieneunerror,cambielapalabralocalhostpor127.0.01,oreviseatentamentelospasos
enelCaptulo1:Instalacin.

Vuelvaalaconsola/MSDOS,yobservelasalidadelcomandorailsserver.Estemuestra
muchainformacinrespectodeltrficosolicitadoporelnavegador:
rails server
=> Booting WEBrick
=> Rails 3.0.0.beta application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-03-02 15:24:01] INFO

WEBrick 1.3.1

[2010-03-02 15:24:01] INFO

ruby 1.8.7 (2010-01-10)

[2010-03-02 15:24:06] INFO

WEBrick::HTTPServer#start: pid=11684 port=3000

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag69/197actualizadoal06/01/13

Recarguelapagina,cambiandoladireccinporhttp://localhost:3000/zaraza
Observeelerrorgenerado,tantoenelnavegadorcomoenlasalidadelserverWeb.
Truco:unaspectocasiescondidodeestabienvenida,eslaposibilidadderevisarsilas
gemasinstaladassatisfacenalaaplicacin.Esimportantehacerclicksobre

Aboutyourapplicationsenvironment
(http://127.0.0.1:3000/rails/info/properties)
Siestoocasionaunerror:
We'resorry,butsomethingwentwrong
Significaque,porrazonesdeseguridad,Railsseniegaamostrarelerror.Paraverqueeslo
quelefalta,debemosrevisarlatrazadelcomandorailsserver.
Webrick,porcierto,esunpequeoserverparahacerpruebassimples.Cuandocorraen
modoproduccin,seguramenteutilizarApacheoMongrel.Sinecesitamaspotenciade
respuestaenmododevelopment,puedeiniciarmongrelenlugardewebrick,desplegando
elserverdelasiguientemanera.

sudo gem1.8 install mongrel


gem install mongrel

Yluego
rails server mongrel

otambin
rackup --server mongrel --port 3000

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag70/197actualizadoal06/01/13

Integrar GIT al proyecto


Entrelosprogramadoresdeeliteexisteunaexpresindenominada"SistemasdeControlde
Revisiones",lacualserefiereaaquellossoftwarescapacesdeautomatizarlastareasde
guardar,recuperar,registrar,identificarymezclarversionesdearchivos.Sonmuytilespara
crearramasdedesarrollodearchivosquesonmodificadosfrecuentemente.Aestose
puedeaadirquecobranverdaderautilidadcuandomuchaspersonastrabajanenun
mismoproyecto.
Selosutilizaparticularmenteparacompartiryhacerelseguimientodecambiosen
algoritmosinformticos,aunquetambinsirvenparacrearenformacolaborativa
documentacin,cartasymanuales.
LossistemasderevisinmasconocidossonCVS,SVN,GIT,Mercurialyotros.GITenparticular
esmuyusadoporlacomunidaddeprogramadoresdeRuby.
Enbreve,yennuestroproyecto,prontocomenzaremosautilizargeneradoresdecdigo.
Tambininstalaremospluginsyllamaremosscriptsquemodificaranvariaspartesdel
proyecto.Escomnqueunproyectonosetocaunsoloarchivo:comounefectomariposa,
loscambiosenunarchivoacarreancambiosenmuchosotros.Alcabodeuntiempo,si
queremosvolveratrs,puedequenosencontremoscondemasiadoscambiosque
deshacer.ElCtrl+Znoestilsiyahemoscerradolosarchivosinvolucrados,ymenosaunsi
hemosrealizadomltiplescambios.Parapeor,muchosdeestoscambiossonautomticos,
esdecir,sonintroducidosporlosscripts.
Mientrasvamosdejandocadavezmasprofesionalnuestroproyecto,utilizaremosGITcomo
anclaymaquinadeltiempo.

Instalacin de GIT

Bajo Linux
BajoLinuxUbuntu,instalaremosGITenmodoconsola,yenelmismopaso,variascmodas
interfacesgrficas,medianteunsimple(10)
10 Nuevamente,sideseaprofundizarenelusodeaptget/aptitude,bajeunacopiagratuitadelManualde
RedesLibres,escritotambinporquienleescribeahora,ydescargabledesde
http://www.bunker.org.ar/incubadora/redes.pdf.Elcaptuloquetrataelusodeaptgetes"Instalando
binariosdesdelasfuentes".

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag71/197actualizadoal06/01/13

sudo apt-get install git-arch git-gui gitk tig qgit giggle meld

Bajo Windows
GIThasidoportadodediversasformasaWindows.Lamayoradelosusuariosqueutilizan
GITbajoelsistemaoperativodelasventanitas,coincidenenquelamejorimplementacin
eslarealizadaporMsysGIT,lacualpuedeobtenerseenhttp://code.google.com/p/msysgit/
Lainstalacinesmuysencilla,ycomonicocomentario,deberamencionarla
convenienciadeactivarlassiguientesopcionesdurantelainstalacin:

Utilizar GIT en forma local


Elpropsitodeestaseccinesmantenerelcdigoquevamosgenerando,aprendera
volveratrseneltiempo,invitargenteaparticipar,yfundamentalmente,comportamos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag72/197actualizadoal06/01/13

comoprogramadoresconexperiencia.

Siamedidaqueprogresaenlaconstruccindelosejemplosdellibro,seencuentracon
errores,otienedudasrespectodecomodeberaverselaaplicacinfinal,recuerdeque
puedecrearunacarpetaencualquierparte,ydentrodeellabajarmiversindela
aplicacin,mediantelaorden

git clone git@github.com:karancho/EjemploLibroRails3.git


Otraopcinessolicitaramicorreo(escuelaint@gmail.com)unpequeoprogramitaque
meencuentrodesarrollandoqueescapazdedesplegarelproyectodeestelibroensu
computadora,chequeandoporelcaminotodosaquelloscomponentesquepudiera
haberseolvidadoinstalar.Aspodrcontrastarsielproblemaestensucdigo,ensu
software,oenmisejemplos.Encasoqueencuentreunerrorenlosejemplos,srvasepor
favorreportarloenhttp://r3uw.heroku.com

Recordemos:

Medianteelcomandorailsnewdemohabamoscreadoelesqueletodela
aplicacin.

Habamosentradoalacarpetamediantecddemo

Habamoslevantadounserverdepruebas,conelcomandorailsserver
Enesteultimopaso,laconsola/MSDOSqueda"capturada",esdecir,nonosdeja
escribirotracosaqueCtrl+C(interrumpir),alavezquemuestralasconsultasdelos
navegadores.

Abrimosotraconsola/MSDOS,entramosnuevamentealaaplicacinmediantecddemo,y
creamosunrepositoriolocal:

cd demo
git init

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag73/197actualizadoal06/01/13

Initialized empty GIT repository in .git /

Eltrmino"local"serefiereaquepodemosgestionartantorepositorioslocalescomo
remotos.
Configuramoselrepositorioconalgunasvariablestiles.
s@mandragora:~/demo$ git config --global user.name "Sergio Alonso"
s@mandragora:~/demo$ git config --global user.email "sergio@eim.esc.edu.ar"
s@mandragora:~/demo$ git config --global color.ui "auto"

Agregamostodoslosarchivosdelproyecto,yrealizamoselprimercommit,omaltraducido
"entrega".
git add .
git commit -a -m "Agregados los archivos del proyecto"
Created initial commit 073c820: - Agregados los archivos del proyecto
128 files changed, 15218 insertions(+), 0 deletions(-)

Enlalneagitcommit,GITinvocara
algneditorparaquecontemosque
cambioshemosrealizado.Se
recomiendaenfticamenteutilizaresta
funcincomoundiariopersonal.
EleditorpreferidodeGITesvim.Caso
contrariobuscaralgnotropresente
enelsistema,comonano,mceditu
otro.

Enelcasodenano,unavezqueterminamosdedescribirnuestrasaventuras,
pulsamosCtrl+Xparasaliryguardar.

Enelcasodevim,anoasustarsesinoscuestaoperarlo.Solodebemospulsarlatecla
deinsercindetexto(i).Escribimosloquesenosantoje,yvolvemosalmodo
comandoconEsc.Lasecuencia:wqgrabar(write)loscambios,ysaldr(quit)al
sistema.
Convengamosquevimnoesmuyamigableensuprimeraimpresin.Tampocoenla
segunda,perosuusoesmuyaceptadoentodalacomunidad,debidoadiversas

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag74/197actualizadoal06/01/13

caractersticasquelohacenprobablementeelmejoreditorenlahistoria(11).Poresta
raznexistencientosdetutorialeseninternetparaoperarestemagnficoeditor.Pase
porelapartadodeEditoresparavermasayudasobreelmismo.

Agregando y cambiando archivos


Vamosahoraacrearunarchivo,ubicadoenpublic/llamadobienvenida.html
Afineseducativos,sucontenidoserincompatibleexprofesoconnavegadoresnuevos
quenosoportenXHTML.Hacerunapaginaincompatibleesmuysimple.Tansolodebemos
olvidarnosdeincluirenlaetiqueta<html>elDOCTYPEapropiado.Estohacequeel
navegadorentreenmodoquirksoraro,yalestilodelosviejosExplorer4yNetscape4,
ciertossmboloscomo,,,etcdebanserexpresadosconlosincmodoscaracters
entities.
Introduciremosapropsitoelcarcter,elcual,obiendeberacontarconelDOCTYPE
apropiado,obiendeberahabersidoexpresadocomoelentitie&iexcl;
<html>
Holas Manolas!
</html>

Paramasinformacinsobreelmodoquirks,lealapagina60delmagnificolibrogratuito
IntroduccinaCSSdeJavierEguluzPrez,quepuedeencontrarseenlibrosweb.es

Ahora,estandoparadosenlarazdelaaplicacin,agregamosestearchivoalmecanismo
deseguimientodeGITmediante
git add public/bienvenida.html

Nota:tambinpodemosagregararchivossinespecificarsuruta,mediante
git add .

11 Si,si.Juntoaemacs,porsupuesto.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag75/197actualizadoal06/01/13

Nota:convenienciadeusargitadd.
Elcomandogitaddsepuedeutilizaracompaadodeunarchivoenparticularalcual
queremosqueGITtrackee(persiga,rastree),osimplementeacompaadodeun.(punto)
final,enelcualGITrevisatodoelrbolenbuscadeagregados,modificadosoborrados.
Elcomandogitadd.esmuycmodocuandohemosrealizadomuchoscambios.Tantos,
quenorecordamoscuantosarchivoshemosinvolucrado.Perodebemostenerencuenta
quequizsagreguecosasquenodebera,talescomobasesgrandes,oarchivoscon
contraseasimportantes.
Paraevitarquegitadd.tomeencuentaciertosarchivos,creamosunarchivoenlarazdel
proyectoconnombre
.gitignore

cuyocontenidosea,porejemplo
db/production.sqlite3

Rails3yavieneconuncmodoarchivo.gitignore,queincluyeciertascarpetasqueno
tienesentidoqueseantrackeadas,nisubidasaservidoresdeproduccin.

Luegodelgitadd,sirealizamosungitstatus,GITanunciarquehaycambiosenelrbol.
Cambiosdeloscualeslnotienecopia.Paraserclaros:nohemoshechotodavala
entrega(elcommit).

git status
# On branch master
# Changes to be committed:
#

new file:

public/bienvenida.html

Realizaremosunanuevaentrega.Cuandonohaymuchoqueinformar,ynoqueremos
entraraleditor,podemosutilizarelmodificadorm,seguidodeunabrevedescripcin.

git commit -m "Agregado archivo de Bienvenida"

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag76/197actualizadoal06/01/13

Created commit 8e5330c: agregado archivo de Bienvenida


1 files changed, 3 insertions(+), 0 deletions(-)
create mode 100644 public/bienvenida.html

Sielservercontinacorriendo(railsserver),yapuntamoselnavegadorhacia
http://localhost:3000/bienvenida.htmldescubriremoselerror:nuestrocarcterseha
convertidoenalgoparecidoa
Ahoraintroducimosalgunoscambios:modificamoselarchivopublic/bienvenida.html:para
adecuarnosmasalstandardquedictalaw3,yleagregaremosalgunasetiquetas.

Loscambiosenelcdigovanennegrita
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
Bienvenido al Sistema
</title>
</head>
<body>
Holas Manolas!
</body>
</html>

Ahoragitstatusdeberamostrarelstatusde"modified".
Informamosdeloscambiosmediantegitaddpublic/bienvenida.html,oelmaspractico:
git add .

Mandamoscopiaalrepositorio,juntoconunabreveexplicacindeloscambiosquesehan
llevadoacabo:
git commit -m "Agregadas etiquetas <head>, <title> y <body>"

Elusohabitualdeloscomandosgitadd.seguidodecommitsepuedenresumirenuna
solaexpresin,conformadacomocommita

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag77/197actualizadoal06/01/13

Siahoraqueremosrevisarloscambiosintroducidos
git show --color
commit c28bc8f3622dcef3e4c431a604e01eef80cf9645
Author: Sergio Alonso <sergio@eim.esc.edu.ar>
Agregadas etiquetas <head>, <title> y <body>
diff --GIT a/public/bienvenida.html b/public/bienvenida.html
index cce29e9..3382961 100644
--- a/public/bienvenida.html
+++ b/public/bienvenida.html
@@ -1,3 +1,10 @@
<html>
-

Holas Manolas!

<head>

<title>

Bienvenido al Sistema

</title>

</head>

<body>

&iexcl;Holas Manolas!

</body>
</html>

Podemosobservarenrojo()laslneasmovidasoquitadas,yenverde(+)lasagregadas.

Nopuedosalirdelcomandogitlog/status/show!
Sielpromptdelalneadecomandosparece"atrapado",porelcarcter[:],ynonos
devuelveelcontroldelaconsola/MSDOS,nosepreocupe.Significaquelaconsolase
encuentrabajoelcomandoless,elcualposeealgunoscomandosparaperseguir
cambios,talescomolatecla/(buscarunapalabra),n(seguirbuscando),yotras,comoq
(salir).

La bitcora del maquinista II


Enestepunto,serainteresanteconsultarelhistorialdeloscambios:
git log

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag78/197actualizadoal06/01/13

Recuerdequepuedeusarlateclaqparasalirdellog.

Sinotamuyconfusalasalidadelcomandogitlog,puedemejorarunpocolavisualizacin
jugandoconlasvariablesmencionadasenelmanualgitloghelp.Porejemplo:
git log --pretty=oneline --color

Alrespecto,BartTrojanowski,enhttp://www.jukie.net/bart/blog/pimpingoutgitlog
recomiendacrearunlogpersonalizado,inyectandolasiguientelneaalaconfiguracinen
elproyecto:
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset \
-%C(yellow)%d%Creset %s

%Cgreen(%cr) %C(bold blue)<%an>%Creset' \

--abbrev-commit --date=relative"

Tambienpuedevertodaslasramasqueincidansobreelproyectohaciendo
git log --pretty --graph color

Ahoratendremoslaposibilidaddehacergitlogennuestroproyectoyobtenerunresumen
muchomasclaro.SrvaseentraralapginadeBartparaveralgunosejemplos.

Interface GIT en modo texto


Tig.Paraquemas?Srvaseobservarlacaptura
depantalla.

Interfaces grficas
Sideseaalgomassofisticado,sealegrarsaber
delaexistenciadegitgui,gitk,qgityel
grandiosomeld.
Puedeinstalarcualquieradeestasherramientas
medianteaptget,yescogerlasllamandolaspor
sunombrepararevisarelcambioentodala
carpeta,ohaciendoun

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag79/197actualizadoal06/01/13

git difftool archivo

Otrabuenacombinacinconsisteendetectarlosarchivoscambiadosejecutandoenlaraz
delproyectoagiggle.Cuandohemosdetectadoalgunoenparticular,podemoscomparar
suhistorialdemodificacionesabrindoloconmeld.

Trabajar con ramas y nmeros de versin


Lasramasdedesarrollosonmuyconocidasenelmundodelsoftwarelibre.Yprcticamente
unanecesidad,yaquecobrancabalutilidadcuandomuchaspersonasaportantrozosde
cdigo,inestableshastaquesedemuestrelocontrario.
Tambinenformalocalpodemosbeneficiarnosdeestainteresantepropiedadqueposee
GIT:supongamosquedeseamosintroduciruncambioennuestrosistema.Predecimosque
lanaturalezadeestecambiopuedetenerconsecuenciasenmuchassecciones.
Entretanto,necesitamosunaversin"estable"queofreceranuestrosclientes.Estoimplica

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag80/197actualizadoal06/01/13

doslineasdedesarrollo.Aligualqueentodoslosproyectosdesoftwarelibre,todoeltiempo
hayramasinestables,confuncionesnuevas,enprocesodetesting,ylaramaestable,ya
comprobada,yconmenossorpresasparalosusuarios.
Aquesdondelasramasdedesarrolloylosnmerosdeversinaparecenparaayudarnos.
Todavanohemoscreadoramas,porlotantoseconsideraqueestamoseneltronco
originaldedesarrollo,omaster.
Respectodelosnmerosdeversiones,amododesugerencia,mepermitoexplicarlaforma
enqueseacostumbraaversionarenlacomunidaddesoftwarelibre.Bajoestacomunidad,
alasversionesquetodavanoestnlistas,selasexpresacondecimales.Porejemplo0.1,
0.3,etc,reservandolosenterosparalosestables.
AlgunosseguidoresdecreadordelkernelLinux,(ydelpropioGIT),elemblemticoLinus
Torvalds,acostumbranaversionarlapartedecimal,mediantenmerosparescuandose
encuentran"listasparalacomunidad".Losvaloresimparesindicanramasparausuariosque
testeanoquerequierendefuncionestodavanoprobadas.
As,unaversin0.1,o1.1estpidiendoquelarevisen,entantoqueuna0.2,omejoran,
una1.02indicaalmenosungradodeestabilidad.
Tambinseutilizanletrasenlosnmerosdeversin.Cuandounadelasramastestingha
llegadounciertogradodemadurez,yellanzamientoesinminente,seesperaquela
comunidadcolaboreenelseguimientodeerrores.Enestoscasosqueseiniciaunamaratn
debsquedadeerrores,seacompaaelnmerodeversinporeltrminoRC(Release
Candidate).
Deestamanera,vamosabautizarnuestraversincomo0.1,dentrodeltroncooriginal
master.
git tag 0.1 master
git tag 0.1

Supongamosahoraquequeremosincluirunafuncindelacualnoestamos
completamenteseguros.Realizaremoscambiosporvariaspartesdelproyecto,alpuntoque
podramosolvidarnosdentrodeunosdascuantoscosashemoscambiado.Prevemos
tambinqueenchufaremosgemasescritasporotraspersonas,queprobablemente

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag81/197actualizadoal06/01/13

modificaranvariaspartesautomticamente.Adecirverdad,quisiramosqueestaversin
seautilizadasolamenteporelusuarioqueactadeenlaceconelsistema(12).
Enlosprximoscaptulosrealizaremosvarioscambios.Sienunpuntolaaplicacinempieza
asoltarvaporportodoslados,comounalocomotoradesbocada,siemprepodremosvolver
anuestraramaestable.
Acontinuacin,generamosunaramatesting,basadaenlaactualmaster:
git branch testing master

Encualramaestamosparados?
git branch
* master
testing

Cambiamosalaramatesting:
git checkout testing
M

public/bienvenida.html

Switched to branch "testing"

Borrando / modificando cosas antes del commit ("entrega")


Tcnicamente,entodomomentopodemosocasionarundesastreeigualmentevolver
atrs.Supongamosqueelgatopasacaminandosobreelteclado,yescribe(13)
rm -rf app/
del app /s /q && rd app /s /q
Estoequivaleadestrozarlacarpetamasimportantedelaaplicacin.Demodoquele
pedimosaGITquerevivalaaplicacintalcomoeraenelltimocommit:
git add .
12 Enlasmetodologasgilesdedesarrollo,generalmenteseinvolucraactivamenteaunrepresentantedelos
clientes,osimplemente,"elusuariomascomprometido",quienseencargadeactuarcomoenlaceentre
losusuarios,susnecesidades,ylosprogramadores.Paramasdatos,revisar
http://es.wikipedia.org/wiki/Desarrollo_gil_de_software
13 Ahsi.Migatopuedohacereso.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag82/197actualizadoal06/01/13

git checkout -f

Simiramosahorahavueltotodoalanormalidad!

Ten cuidado con lo que deseas


gitcheckoutftambinpuedequitarcosasdelasquenosarrepentimoscrear.
Porejemplo,sidecidimospedirleaRailsquenosconstruyaautomticamenteunaseccin
nueva,peroselopedimosmal,podemosencontrarnoscondecenasdearchivosnuevos
paraborrar,regadosalolargodetodalaaplicacin.
Masadelanteveremosenprofundidadlosmgicosscaffolds.Porahora,soltamoslaorden

rails generate scaffold Deposito domicilio:string encargado:string


capacidad:float
ruby script\rails generate scaffold Deposito domicilio:string encargado:string
capacidad:float

Estaordennosgeneraratodaclasedecosasnuevas:
invoke active_record

create app/views/depositos/show.html.erb

create db/migrate/20100314175320_create_depositos.rb

create app/views/depositos/new.html.erb

create app/models/deposito.rb

create app/views/depositos/_form.html.erb

invoke test_unit

create app/views/layouts/depositos.html.erb

create test/unit/deposito_test.rb

invoke test_unit

create test/fixtures/depositos.yml

create test/functional/depositos_controller_test.rb

route resources :depositos

invoke helper

invoke scaffold_controller

create app/helpers/depositos_helper.rb

create app/controllers/depositos_controller.rb

invoke test_unit

invoke erb

create test/unit/helpers/depositos_helper_test.rb

create app/views/depositos

invoke stylesheets

create app/views/depositos/index.html.erb

create public/stylesheets/scaffold.css

create app/views/depositos/edit.html.erb

Masadelantehablaremosdelaconvenienciadenombrareninglesalasclases,tablasy
camposdelosproyectos."Deposito"sedeberahaberllamado"Depot","encargado"
deberahabersellamado"manager",yas.Esdecir,hemosmetidolapata.
Anopreocuparse!Enestaocasin,haytodaclasedecosasnuevas.Demodoque

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag83/197actualizadoal06/01/13

ponemosaltantoaGITdelasnovedades:
git add .

Ycomonohemosrealizadotodavaningunaentrega("commit"),rebobinamostodoslos
cambios,hastaelltimocommit.
git checkout -f

Borrando / modificando cosas despus del commit


Estaeslasituacinmasfrecuente.Realizamoscambios,ylosentregamos("commit")al
repositorio.Luegonosarrepentimos.
Ejemplo:movidosporlainspiracin,leagregamosalgunaslneasalarchivo
config/databases.yml
echo "lineas tentativas" >> config/database.yml
echo "lineas tentativas" > config\database.yml

Nohabiendoarchivosnuevosniborrados,nohacefalta(aunquenomolesta)realizarel
git add .

Esdecir,alhabersolounarchivomodificado,bastaconrealizaruncommita
git commit -a

Seabreeleditorsolicitandoleexpliquemoslanaturalezadeloscambios

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag84/197actualizadoal06/01/13

Acontinuacin,borramoslacarpetadoc.Alfinyalcabo,nadielalee.
rm -rf doc/
del doc /s /q && rd doc /s /q
AlhabercambiosenarchivosqueGITconoce,utilizamosgitadd.osimplemente
agregamosaalcommit.
git commit -a -m "documentacin borrada"

Finalmente,realizamosunaaccintpicadeRails:instalamosuncomponentedeotra
personaquenosfacilitalascosas.Enestecaso,unpluginquepermiteconmuypoco
esfuerzo,presentarcomo"paginas"loslistadosmuyextensos.
rails plugin install git://github.com/mislav/will_paginate.git
ruby script\rails plugin install git://github.com/mislav/will_paginate.git

Estecomandoiniciaunadescargadedatoshacialacarpetavendor/plugins.
Ledecimosalrepositorioquereviseelrbolenbuscadecarpetasyarchivosnuevos.
git add .

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag85/197actualizadoal06/01/13

git commit -m "agregado plugin para paginar fcilmente las salidas"

Sorpresa!Cuandoiniciamoselserver
rails server
ruby script\rails server

Todosecolapsamiserablemente.Elmensaje:
/usr/lib/ruby/1.8/yaml.rb:133:in `load': syntax error on line 23, col -1: `'
(ArgumentError)
from /usr/lib/ruby/1.8/yaml.rb:133:in `load'
from /usr/lib/ruby/gems/1.8/gems/railties3.0.0.beta/lib/rails/application/configuration.rb:64:in `database_configuration'

Algoenlaconfiguracindelasbasesestmal.Alparecernuestrocambioen
config/databases.yml(hacetrescommits),nofuedelagradodelframework.
Sinembargo,nodeseamosborrarnielultimocambio(lainstalacindelplugin),niel
penltimo(elborradodedoc/).
Sideseamoscorregirerrorespuntuales,revisamosellog
git log --pretty=oneline

9b7a92b6cc7be5dbf259ac4a19e8515a25978e65 agregado plugin para paginar fcilmente las


salidas
9139194255481f5d564c68732f9a62b92a3afd0c borrada carpeta doc/
b6712b8d76d5a7bd5a515797f141e9bacacee5a0 Agregadas lineas tentativas a database.yml
be3eb69feacfd658f3e11ef87f1280316a1a7e9a Agregadas etiquetas <head>, <title> y <body>
53873d5e91f9e527ae765e80faf7bb00b66fdf91 agregado archivo de Bienvenida
8af7a6da99cf51fdb808e7571de87a8db8e22255 - Agregados los archivos del proyecto Configuradas algunas variables

(Enrojoelcambioquenuncadebiserhecho).
Porlotantohagounrevert"solo"aesemomentoeneltiempo.
git revert b6712b8d76d5a7bd5a515797f141e9bacacee5a0

Unrevertescomouncommit:seabreeleditorpidiendolasrazonesdelarrepentimiento,

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag86/197actualizadoal06/01/13

aunquepodemosignorarlassimplementesaliendo.

Siahoracorremosnuevamenteelserverdepruebas,estedeberainiciarsinproblemas.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag87/197actualizadoal06/01/13

DurodeResetear
Luegodeuntiempo,descubrimosqueelpluginquehabamosinstalado...enrealidadnos
estorba.Yadems,sacarlacarpetadoc/fuemuymalaidea.

Podemosvolvereneltiempoabsolutamentetodo,destruyendotodoslos
cambios,hastaelltimocommit:
git reset --hard HEAD^

Sideseamosvolver#versioneshaciaatrs(revisarprimerocongitlog)
git reset --hard HEAD-#

Lapreguntaes:cuandomiaplicacinrealmentemegustaba?
Sinodeseamos"contarconlosdedos"cuantoscambiossehanidosucediendo,podemos
escogerunodeloshashquefiguranengitlog,mediantegitresethardSHA1_HASH
Enestecaso:
git log --pretty=oneline
9b7a92b6cc7be5dbf259ac4a19e8515a25978e65 agregado plugin para paginar fcilmente las
salidas
9139194255481f5d564c68732f9a62b92a3afd0c borrada carpeta doc/
b6712b8d76d5a7bd5a515797f141e9bacacee5a0 Agregadas lineas tentativas a database.yml
be3eb69feacfd658f3e11ef87f1280316a1a7e9a Agregadas etiquetas <head>, <title> y <body>
53873d5e91f9e527ae765e80faf7bb00b66fdf91 agregado archivo de Bienvenida
8af7a6da99cf51fdb808e7571de87a8db8e22255 - Agregados los archivos del proyecto Configuradas algunas variables

Volvemoscasialprincipiodelaramatesting:

gitresethardbe3eb69feacfd658f3e11ef87f1280316a1a7e9a

Siahorahacemos
git log --pretty=oneline
be3eb69feacfd658f3e11ef87f1280316a1a7e9a Agregadas etiquetas <head>, <title> y <body>
53873d5e91f9e527ae765e80faf7bb00b66fdf91 agregado archivo de Bienvenida
8af7a6da99cf51fdb808e7571de87a8db8e22255 Agregados los archivos del proyecto Configuradas algunas variables

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag88/197actualizadoal06/01/13

TodosloscommitsycambioshandejadodeexistirydesertenidosencuentaporGIT.
Bastadejugar!Volvemosalaramamaster
git checkout master

Borramoselpatiodejuegos
git branch -d testing

Revert, Reset, Checkout


Supongamosquepudiramosmandaratravsdeltiempo,unacajadepreservativosal
padredeHitler.Estoseraelequivalenteaunrevert,quenospermitecambiarcosas
puntualesquesucedieronelpasado.
Porsuparte,resethard"rebobinalahistoria".Siaestecomandoleotorgramosellibre
albedro,nospodradejarparadosenelmedioevosinposibilidaddevolver.
Otraformadecambiopuntualescheckout,peroconladiferenciaque,alestilode"Volver
alFuturo",nosllevaaunpuntodelpasadoenelquetodocambioiniciaunarealidad(o
rama)alternativa.Paramasdatos,consultar
http://crypto.stanford.edu/~blynn/gitmagic/intl/es/ch02.html

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag89/197actualizadoal06/01/13

Resumen de este captulo


Resumiraqulospasosimportantesquehemosrealizado:
Habamoscreadolaaplicacinmediante
rails new demo

Entramosalacarpeta,mediante
cd demo

Corremoselserverenmodotesting,ylodejamosmostrandosusoperacionesinternas:
rails server

ruby script\rails server

InstalamosGIT.Posteriormente,creamosunrepositoriolocal.
git init

Agregamosalgunosarchivossinimportancia(gitadd.)entrecommitycommit(git
commit),loscorregimos.
Luego,paraprobaralgunoscambiosmascomplejos,creamosunaramatesting,mediante
laorden
git branch testing

Lallenamosdebasura,ylarompimosunpoco.Luegodeshicimosalgunos(ytodos)los
cambios.Volvimosalaramamaster,mediante
git checkout master

Yfinalmenteborramoslaramatesting.
git branch -d testing

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag90/197actualizadoal06/01/13

Captulo5
Captulo 5: Hola Mundo en Rails
CuandoelnavegadorhaceunsolicitudalservidorWeb,yestaesparseadaalaaplicacin
Rails,laURLesdescompuestaenbuscadeunaaccinasociada.Lasaccionesestn
definidasdentrodeloscontroladores,quienesdecidenquehacerconlaURLcargadaenel
navegador.
Estoqueenprincipiosuenaconfuso,escomn(ymuchomasdifcildeconfigurar),enlos
demsframeworksdelmercado.Sinembargo,esmuytilparacreardireccioneslegibles
porsereshumanos,yspidersdebuscadores.Convengamosqueesmuchomasfcil
recordar:
http://www.mascotas.org.ar/adopciones/modificar/46
queladireccin.
http://www.mascotas.org.ar/adopciones.php?id=46&accion=modificar

Esdecir:RailsanalizalaURL(direccin)yladescomponeparaencontrar

Elcontrolador

Laaccin

Otrosparmetros

Enelsiguientecaptulovamosaintentarnuestraaplicacinrespondadeformadistintaalas
siguientessolicitudes:

/hola
Enestecasoelnavegadordebemostrarunsimple"holaMundo"

/hola/4
Aquencambio,el4debeserredirigidohaciaalgunaseccindondesalude
"calurosamente",esdecir,cuatroveces.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag91/197actualizadoal06/01/13

Controladores y Acciones
"Turutaesmiruta"
Anibal,"elNumberOne"
Antesdecomenzar,vamosacrearnuevamenteunaramadondeprobarcosas,sinponer
enriesgolaaplicacintalcomoest.Noescuestinquenosechenlaculpadesdeel
ColisionadordeHadronescuandolascosascomiencenaexplotar.
git branch holamundo

Cambiamosaestanuevarama
git checkout holamundo

Opcional:estaramatienesu
origenenlaversin0.1de
master.Esdecir,sialguien
consultasunmerodeversin
(gittag),laconsiderar
estable(14).
Paradejarclaroquesetratadeunpolgonodetiro,yquesuscambiossolodeberanser
utilizadospordesarrolladorescercanosalproyecto,lepodemossituarunvalorimpardetrs,
como.1

git tag 0.1.1 holamundo

Masadelanteveremoscomosituarnuestroproyectoenunrepositoriopblico.Estos
repositoriostienenlaposibilidaddepermitiralosusuariosquetirendelaramaquedeseen.
Sinoseespecificaotracosa,tirarandelamaster.
14 Nuevamente,ejemplosconelkernellinux:

1.2.1estable

1.3.5inestable

2.5.xinestable

2.6.48estable

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag92/197actualizadoal06/01/13

VolvamosaRails,yaltratamientodelasURLs:elarchivoquetraducelasdireccionesydirige
eltrficohacialasacciones,seencuentraenconfig/routes.rb.Loabrimos,yleagregamos
laslneasennegrita:
Cuidadoalcopiar.Ciertaslneas,cuyoorigenenelPDFeselISO88591,
setraducenmalenelUTF8delaterminal(Linux)oenelWindows1852(MSDOS)
Consejo:noseavagoyescribamanualmenteloscomandos.

Demo::Application.routes.draw do |map|
match ':controller(/:action(/:id(.:format)))'
end

Deestamanera,RailsdescomponeladireccinURLylareenvaalcontroladoraccin
adecuado.Crearemosuncontrolador
rails generate controller hola
ruby script\rails generate controller hola

Abrimosapp/controllers/hola_controller.rb,yleagregamosdosacciones:
class HolaController < ApplicationController
def mundo
render :text => "Hola <b>Mundo</b>"
end
def caluroso
@valor=params[:id].to_i
end
end

Reiniciamos(Ctrl + C)elservidorWeb,ycargamosenelnavegadorladireccin
http://localhost:3000/hola/mundo

Enestecaso,loquehasucedidoesmuysimple:laaccinmundohacreadounapequea
vistamediantelaordenrender,conunbrevemensaje.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag93/197actualizadoal06/01/13

Sinembargo,deberamoshabercreadounarchivollamado
app/views/hola/mundo.html.erb
AunpuristadelMVCnolegustaraesteejemplo.Hemosensuciadounaaccin(enlas
barbasdelcontrolador!)conetiquetas<b>detipohtml.
Ases:enocasiones,pararespuestassimples,seinstalacdigopropiodelaVista
medianterender,enplenaAccin.Porsupuesto,noesconveniente,yaqueconeltiempo
secomplicaralavisualizacinylaseparacindecontenido(15).
Vamosalotroejemplo.Laideaesquelamaquinasaludecalurosamente:variasveces,
deacuerdoaunvalorpasadoporURL.
Sinembargo,siintentamosconladireccinhttp://localhost:3000/hola/

caluroso/

4
,
obtendremosunerrordeTemplate(oVista),locualescorrecto:recordemosqueenla
segundaaccin,nocreamosunavistamedianterender,sinoquenoslimitamosarecibirlos
datos,procesarlos(sihacefalta),ydejarlosdisponiblesparalavistaasociada.Aqurepitola
parteencuestin:
def caluroso
@valor=params[:id].to_i
end
Podemosobservarqueelvalor4pasadodesdelaURL,haquedadodisponiblebajola
variableparams[:id].Porcierto,losvaloresquesepasandeestamanera,quedan
expresadoscomocadenas,demodoquesiqueremosrealizaroperacionesmatemticas
sobrel,debemosconvertirloaentero(.to_i).
15 Seexponeesteejemplo,dedicadoaaquellosprogramadoresquegustandeunificartodo.Dosframeworks
pequeosypotentesquenoimplementanMVC,ymantienentodaslascosasunidas,sonPadrinoySinatra.
OcomodiraFontanarrosa:"elsigloXXInosencontrarunidosyamontonados".

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag94/197actualizadoal06/01/13

Elvalor4espuestoarecaudoenunatributo@valor,accesibletambinporlavista,lacual
sedisparainmediatamentedespusqueterminalaejecucindelaaccin.EnRails,cada
accintieneunavistaasociada.Elerrorrecinobtenidoexplicaclaramentequenohay
unavista(template)disponible.
Paraelcasodeestaaccin,fabricamosunarchivoenapp/views/hola/caluroso.html.erb,
cuyocontenidodebeparecersealsiguiente:
Denuevo:cuidadoalcopiarpegar:lacodificacindeloscaracterespuedevariarenel
destino.
<% for i in 0..@valor %>
<p>
<%= "Hola Mundo " %>
<%=i %>
<% end %>

Enestaslneas,recorremosde0a4,saludandocalurosamenteencadavuelta.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag95/197actualizadoal06/01/13

Parafinalizar:esteltimoarchivo,app/views/hola/caluroso.html.erb,noexisteenel
repositorio:

git add .

Recuerdenquesialgoandamal,podemosempezardenuevolacreacindelhola
mundo,mediante
git add .
git checkout -f

Reapuntando la pgina principal


Ahoraquenuestraaplicacinrespondesegnlosparmetrosenviadospordireccin
http://,yaestamosencondicionesdeenviarlasimplesolicitudhttp://localhost:3000auna
nuevapginaprincipal,lacualserlanzaderadetodalaaplicacin.
Comoprimeramedida,borramoslapginaprincipaldeRails.
rm public/index.html
del public\index.html

Ahoraabrimosnuevamenteelarchivoconfig/routes.rb,
yleagregamosunalnea
root :to => "hola#principal"

Sibienelcontroladorholaexisteytienedosaccionesadentro,laaccinprincipalanno
existe.Editamosapp/controllers/hola_controller.rbyleagregamos
def principal
end

Noesunaaccinmuyimpresionantequedigamos.Perocumpleunasimplefuncin:
cuandoterminesuejecucin,Railsbuscarunavistaasociadaen
app/views/hola/principal.html.erb

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag96/197actualizadoal06/01/13

Estearchivonoexiste,demodoquelocreamosconelsiguientecontenido
<h1>Pgina principal</h1>
o tambin
<h1>P&aacute;gina Principal</h1>

Sitodoanduvobien,ahorahttp://localhostdeberamostrarnos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag97/197actualizadoal06/01/13

Parafinalizar,entregamosloscambiosaGIT
git commit -m "holamundo funcionando"

Sirecuerdan,estamosparadosenlaramaholamundo.Volvemosalazonaestable.
git checkout master

Ydesdelaramamaster,mezclamos("merge")lasnuevasyflamantesinnovaciones
presentesdelaramaholamundo.
git merge holamundo

Opcional:tambinpodramosactualizarlaversindelaramaestable:
git tag 0.2 master

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag98/197actualizadoal06/01/13

Captulo6
Captulo 6: ActiveRecord
ActiveRecordesunabibliotecacapazderealizarMapeosRelacionalesdeObjetos(ORM).
LasabstraccionesORMsirvenparaaccederalosdatosdelosmotoresSQL,sinpreocuparse
porlasintaxisdecadamotorenparticular.Ademsotorgalafacilidaddetrataralastablas
comoobjetos,yasuscamposcomoatributos.
Estalibrerapuedeahorrarnosmontonesdelneasdecdigo.Sinembargo,paralograrsu
magia,realizaunaespeciedepactoconelprogramador,queconvienerespetar.
Paraempezar,Railsesunframeworkqueseadscribeaunafilosofadenominada
ConvencinenvezdeConfiguracin,locualaceleraengranmedidaeldesarrollo.
Unadesusconvencionesestrabajareningles.Estonosorprendenimolestaaningn
programadoracostumbradoatrabajarenfactorasdesoftware.Inclusoesmuytilsise
deseaabriryacelerareldesarrollodelproyectoatrayendoaprogramadoresdela
comunidaddeSoftwareLibre.
As,sivamosatenerunatabla"Compaas",latrataremoseningls.Tambindebemos
atenernosalasconvencionesdeRails,ycuidandomaysculasytiemposverbales.Ejemplo:

Tabla:companies

Modelo:Company

Archivoquecontendrladefinicin:app/model/company.rb

Laclaveprincipaldelastablassiempreserid,no"id_company","cod_company"o
engendrossimilares.

Lasclavesajenassiempreterminarnen_id,ejemplo:category_id, status_id,
etc

Sepuedeutilizarnombrescompuestos"CamelCase"enlosmodelos,peroenciertaspartes
paralascualesRailsdebemantenercompatibilidad,seutilizarel_separandoambos
trminos.Porejemplo,enelseguimientodeerratasdeestelibro,utilizounmodeloErrorType
quedescribeeltipodeerrordescubiertoporellector(Tcnico,Ortografa,Sugerencia).La

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag99/197actualizadoal06/01/13

tablaasociadasererror_types.Ysiotratablaposeeunndiceajenoqueapuntaaesta
tabla,elnombredelacolumnasererror_type_id.Larelacindescriptaenelmodelodela
otratabla,porejemplobelongs_to,serhacia:error_type.
Estasconvencionesimpacientanamuchosprogramadores,peroagradaalamayora,ya
quelepermiteaRailstrabajarautomticamente,yprescindirdefastidiosasconfiguraciones
XML,comolasexistentesenStruts,Spring,odiversosmtodosdepersistencia.
PorestaraznlosframeworksqueusanConvencinenvezdeConfiguracinsontildados
de"fascistas".Enenelbuensentidodelapalabra:fascismoserefierealaimposicinde
unaideaporpartedemuchaspersonas.PerosucedequelasideasdeRailssonmuy
buenas,yhansidoconsensuadaspormuchosyexcelentesprogramadores.
Esteaspectofascistasedetectaendosaspectos:elidioma,ylasconvenciones.
Yavimoslasconvenciones.Encuantoalidioma,serecomiendatrabajarlomasposibleen
ingles,puestoqueRails"intuye"mejorenestalengua.Porsupuesto,haydiversoshackso
"inflections",quepermitentrabajarconunRailsespaolizado.Sinembargo,norecomiendo
molestarseenhackearRails:elingls,nosgusteono,eslalenguaquesehablaenel
mundodelaprogramacin.
Norecibiremosmuchaayudaenlosforossinosempeamosenquechinos,rusos,rabes,
alemanes,etc,debanentenderqueelsignificadodelapalabra"deposito".Sitenemosuna
buenaidea,ycreemosquesepuedeconvertirenalgorealmentegrande,podemossubir
nuestroproyectoaunrepositoriopublicoyllamaratodalacomunidaddesoftwarelibre
paraquecolabore.TodosagradecernquenoshayamosmolestadoenacudiralGoogle
Translate,paracambiareltrmino"Depsito"por"Depot".
Coincidirconmigoenqueaumentarnlaposibilidadesqueotraspersonasnosayudenen
nuestroproyecto,simantenemoscompatiblestodaslaspiezas.
UstedmismoentrarmuchasvecesaRubyForgeoaGitHubabuscaralgnpedazode
cdigoqueleahorresemanasdetrabajo.Leaseguroqueagradeceramasdeunhind,
questehayaignoradosunatalhindi,yenlugardeutilizar""paradefinirun"deposito",lo
hayaexpresadocomo"depot".Almenosenespaolcompartimoselmismojuegode
smboloslatinos.Pienseeneltrabajoquelehatomadoalhind,cambiarhastasualfabeto
denacimiento!
Finalmente,elhechoquelaaplicacinpordentropienseeningls,nosignificaquehable

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag100/197actualizadoal06/01/13

eninglsconelusuario.Railsvienemuybienpreparadoparainternacionalizar("i18n")la
interface.Nuestrosusuarios,ylosusuariosdenuestrosprogramadoreshindes,podrn
cambiarelidiomaaeleccin:esloquesedice...unaaplicacinbienconstruida!

Elsegundoaspectoaanalizareslanomenclaturaquedeberamosrespetarentablas,
ndicesynombresdeclase.Lacualnodeberasercomplicadadeseguir...aexcepcin
queestpensandoenreprogramarunaaplicacinanterior.Nosepreocupe:empleando
laaclaracinnecesariaenlosmodelos,sepuedeusarcualquiernombreenlastablase
ndicesexistentes.

Ejemplo de creacin de modelo, y alteracin de las convenciones


Atencin:estaseccinhasidoconstruidaconelpropsitoqueUd.entiendalaformaen
querazonaRailsdurantesusprocesosautomticos,einclusoaprendaamodificarsu
comportamiento,respectodeaplicacionesescritasconanterioridadenotrolenguaje.
Sinembargo,laideanoespersonalizarcadanuevaaplicacinqueinicie.Las
convencionesdeRailsdeberanrespetarsesimplementeporqueintroducenabuenas
prcticasdeprogramacin.

rails generate model Empresa nombre:string cod_empresa:integer


ruby script\rails generate model Empresa nombre:string cod_empresa:integer
invoke

active_record

create

db/migrate/20100314191942_create_empresas.rb

create

app/models/empresa.rb

invoke

test_unit

create

test/unit/empresa_test.rb

create

test/fixtures/empresas.yml

EnestepuntoRailscalculaquelatablasellamarempresas,yqueelidseruncampo
llamadoid.Sinembargo,supongamosquetenemosunatabla(sindatos,cuidado!)
llamadaempresa(ensingular),conclaveprincipalcod_empresa,yuncamponombre.
1. Durantelaordenmigrate,hemoscreadounarchivo
db/migrate/20100314191942_create_empresas.rb

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag101/197actualizadoal06/01/13

Estearchivocumpledospropsitos:enunosinstantes,serutilizadoporunscript
llamadorake,queutilizarlasdefinicionesexistentesenlpara:

Crearfsicamentelastablasenbasededatos.

Crear/Actualizarunarchivodb/schema.rb,elcualposeeclasescon
informacindetodaslastablasexistentesenlabasededatos:elcoraznde
ORMo"ObjectRelationalMap".

DeberamosinterceptarestearchivoantesqueRailsloprocese.
a) Loabrimosyloalteramosdelasiguientemanera(cambiosennegrita):
class CreateEmpresas < ActiveRecord::Migration
def self.up
create_table :empresa do |t|
t.column :nombre, :string
t.column :cod_empresa, :integer
t.timestamps
end
add_index :empresa, :cod_empresa
end
def self.down
drop_table :empresas
end
end

b) Ejecutamosrake:
rake db:migrate
== CreateEmpresas: migrating
=================================================
-- create_table(:empresa) -> 0.0016s
-- add_index(:empresa, :cod_empresa) -> 0.0003s
== CreateEmpresas: migrated (0.0021s)
========================================

Antesdeseguir,podemosconstatarlacreacinfsicadelatabla,medianteel
pluginSQLiteManagerdeFirefox(HerramientasSQLiteManager).Tambines
recomendablemirardentrodedb/schema.rb,ladefinicindelaclaseEmpresa.

2. Ascomoenschema.rbestnlasdefinicionesdelastablasexistentesennuestra

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag102/197actualizadoal06/01/13

aplicacin,cadaunadelastablastieneunmodelorelacionado.
Abrimosapp/models/empresa.rbyloalteramossegnnuestrasnecesidades.Eneste
caso:
class Company < ActiveRecord::Base
set_table_name 'empresa'
set_primary_key 'cod_empresa'
end

Recuerde(unavezmas),quesiduranteestecaptulohacometidounerror,puede
comenzarlodevueltaborrandoloscambios:
git add .
git checkout -f

Comprobar todo
UnamaneradeaveriguarsiRubyescapazdeutilizarestatabladscola,esdecir,noatada
alasconvenciones,escrearalgunosdatosdesdelaconsola:
rails console
ruby script\rails console

irb(main):001:0> unaempresa = Empresa.new


=> #<Empresa id: nil, nombre: nil, cod_empresa: nil, created_at: nil, updated_at:
nil>
irb(main):002:0> unaempresa.nombre = "Pastas Alfredo"
=> "Pastas Alfredo"
irb(main):003:0> unaempresa.save
=> true

SerciertoqueahoraRailsrespetanuestrocod_empresaenlugardesuid?
irb(main):004:0> unaempresa
=> #<Empresa id: 1, nombre: "Pastas Alfredo", cod_empresa: 1, created_at: "201003-14 19:54:05", updated_at: "2010-03-14 19:54:05">

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag103/197actualizadoal06/01/13

irb(main):005:0> unaempresa.cod_empresa
=> 1
irb(main):006:0> unaempresa.id
=> nil

Nota:derealizaralgncambioenlosmodelos,sedebevolveraingresararails
console,yreiniciarporciertorailsserver

Resumen
Esperoquehayadisfrutadodeestaseccin.Sibienescompleja,esmuyposiblequedeba
tenerlaencuentaparacuandomigresusaplicacionesactualesaRails.
Noobstante,noutilizaremoslaclaseEmpresanisusmodelos,sinosusequivalentesen
ingls,demodoquedaremosvueltaatrscontodasestasanticonvenciones:

git add .
git checkout -f

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag104/197actualizadoal06/01/13

Desarrollar, Testear, Producir


Vamosaconocerunadelasprcticasquemassorprendeaaquellosqueseacercana
Rails.Empecemosabriendoelarchivoconfig/databases.yml
Unavezadentro,podremos
constatartresentornosde
produccinenRails:
Development,Testy
Production.
Todosestosentornospueden
trabajarensimultneo:incluso
enelserverdeproduccin
podemoshacerpruebas,e
invitaralosusuariosmas
valientesaqueentrenporel
puerto3000aprobarlas
innovaciones.
Asociadosaestosentornos,seencuentranlasbases,lascualespuedenserdedistintos
fabricantes.Unaherramientamgicallamadarakeseencargardemigrardatosentre
ellas.Todavanousamosrake,perosiatitulodecuriosidadquiereasombrarsedealgunas
desusposibilidades,pruebeejecutar
rake -T

Comosugerencia,unamaneradenopreocuparseporlosdetallesdeimplementacinde
labasededatos,consisteenutilizarSQLite,almenosparalasetapasdevelopmentytest.
Luegopuedeusaradaptadoresparaotrascosasmaspotentes.Entoncesrakeseencargar
decrearunabasadaproductionsobre,porejemplo,PostgreSQL,conlaestructuradela
basedevelopment.
LasbasesRDBMSnormalmenteatiendenenunpuerto,custodiadoporunservicioo
"daemon",yocupandorecursosinclusocuandonoselasutiliza.PeroparausarSQLite,no
hacefaltainstalarmasqueunospocospaquetesbsicosylasgemas.Unamala

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag105/197actualizadoal06/01/13

comparacin,podranserlosarchivos.mdbdeAccess.
Lasbases,alestilodeAccess,odeFoxPro,seguardanenlacarpeta/db.
PorqueutilizarSQLite?EnrealidadpuedeutilizartodaclasedemotoresSQL.Peroeste
pequeomotorserecomiendamuchoenlacomunidaddesoftwarelibreporlassiguientes
razones:

Esmuyrpidoparaconsultas
Esmuyportable:puedeserempaquetadoenmotorcitosAjaxcomoGoogleGears,
AdobeAIRyotros,paracacheardatosdelladodelcliente.

ElprincipiodetrabajodeSQLiteesmuysimple.Podramoscrearlabasemediantealgn
administradordeSQLite,orealizando:
sqlite3 db\development.sqlite3
peroestoimplicaraquequeremosaprenderahacerlascosasalestiloSQLite3.Pero
recordemosquenuestroORM,ActiveRecord,deseaquenonospreocupemosporelmotor
SQL.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag106/197actualizadoal06/01/13

Captulo7
Captulo 7: A levantar los andamios: Scaffolds
Enciertamanera,losscaffoldssonloscaballosdebatalladeRails.
Setratadeunosscriptscapacesdecrearmodelos,vistasycontroladoresapartirdeunos
pocosdatos.SonmuybuenosparacrearABMs(altas,bajasymodificaciones)enforma
rpida,paraluegopersonalizarlosagusto(16).
Comenthaceunaspocashojas,laideadetrabajar,mediantelasconvencioneseningles.
PorellohemosborradotodareferenciaaEmpresa,alavezquecomenzamosconunnuevo
modeloCompany.Elscriptscaffoldnoscrearademslasrutas,algunasvistas,einclusoel
controlador.
rails generate scaffold Company name:string address:string active:boolean
ruby script\rails generate scaffold Company name:string address:string
active:boolean
exists

app/models/

exists

app/controllers/

exists

app/helpers/

create

app/views/companies

exists

app/views/layouts/

exists

test/functional/

exists

test/unit/

create

test/unit/helpers/

exists

public/stylesheets/

create

app/views/companies/index.html.erb

create

app/views/companies/show.html.erb

create

app/views/companies/new.html.erb

create

app/views/companies/edit.html.erb

create

app/views/layouts/companies.html.erb

create

public/stylesheets/scaffold.css

create

app/controllers/companies_controller.rb

16 LosABMspuedenserencontradosenpginaseninglscomoCRUD(Create,Read,Update,Delete).

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag107/197actualizadoal06/01/13

create

test/functional/companies_controller_test.rb

create

app/helpers/companies_helper.rb

create

test/unit/helpers/companies_helper_test.rb

route
dependency

map.resources :companies
model

exists

app/models/

exists

test/unit/

exists

test/fixtures/

create

app/models/company.rb

create

test/unit/company_test.rb

create

test/fixtures/companies.yml

create

db/migrate

create

db/migrate/20100111165913_create_companies.rb

Corremoslamigracin:
rake db:migrate
==

CreateCompanies: migrating ================================================

-- create_table(:companies)
-> 0.0057s
==

CreateCompanies: migrated (0.0061s) =======================================

AbrimosFirefoxenladireccinhttp://localhost:3000/companies

Nadamalpara2(dos)lneas.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag108/197actualizadoal06/01/13

Observelalneaqueconstruyelaclaseo"modelo",app/models/company.rb.Tambin
podrapreciarlacreacindelcontrolador,ydevariasvistascorrespondientesaacciones
ABM(index,new,edit,show).
LosscaffoldssontilespararealizarrpidamenteelABMdeunatabla,yaprenderunpoco
delarailswaysdehacerlascosas.

AvisamosaGITquecomienceaseguiralosnuevosarchivos:
git add .

Siesttodobien,entregamosloscambiosmediante
git commit -m "Scaffold de Compaias"

Casocontrario
git checkout -f

Enestafase,esimprescindiblerevisarlamagiadetrsdescaffold

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag109/197actualizadoal06/01/13

Caminar hasta la locomotora


Conozcamosalmaquinista!VamosalcorazndelModeloVistaControlador,lacarpeta
\app.
Allpodremosconstatarlacreacindeunmontndecosas.Deberamostomarnosunos
largosminutosenrevisar:

app\controllers\companies_controller.rb

app\models\company.rb

app\views\companies

edit.html.erb

index.html.erb

new.html.erb

show.html.erb

Muybienlosandamios...perodondealmacenanlosdatos?

PodemosconstatarlasinsercionesmediantealgnadministradorparaSQLite,talcomo
SQLiteManager(plugindeFirefox).VimossusdetallesdeinstalacinenelCaptulo1.
MedianteSQLiteManagerpodemosabrirelarchivodb\development.sqlite3.Allpodremos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag110/197actualizadoal06/01/13

constatarlacreacindelatablaysueventualllenadodesdelavistanew.
Porcierto:rakenoshaconstruidotodosloscampos,maselid,ydoscamposmuytiles:
created_atyupdated_at

Cmosabarakequecosascrear?
Sirecordamoslasalidadegeneratescaffold,notaremoslapresenciadeunarchivo
db/migrate/20100506030728_create_companies.rb
Estearchivocontieneladefinicinrespectodecomodeberasercreadalaclase,sureflejo
endb/schema.rb,ysuscampos.
Comolohizorake?Esunbuenmomentopararevisarelarchivodebitcora.

La bitcora del maquinista


TodoeltiempoRailsllevaunregistrodetodoloquehace.
more log/development.log
more log\development.log

AllnosencontraremosconunmontndeinstruccionesSQLquehechoActiveRecordpor
nosotros:instruccionesCREATETABLE,CREATEDATABASE,etc.

Nota1:EnWindows,debidoaqueestearchivoestescritoenutf8,yMSDOStrabajaen
ASCII,lasalidaenpantallacontendralgunoscaracteresextraos.
Nota2:EnLinuxseacostumbraausartailfenlugardelanticuadomore.Enestecaso,
tail -f log/development.log

Estecomandomantienecapturadalaterminalmientrasrelata(tail)loscambiosalfinalde

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag111/197actualizadoal06/01/13

unarchivo.Siqueremoscortarloyretomarlaconsola,pulsamosCtrl+C
OtraopcinenUbuntu,esabrirestearchivomedianteunautilidadqueseencuentraen
Alt+F1SistemaAdministracinVisordeArchivosdeSuceso
Ennuestromismocdigotambinpodemosvolcarallog.Encualquierpartedeuna
accin,podemosagregarlneasalestilo:
logger.info("#{Time.now} Borrando una empresa cuyo ID es el ##{@company.id}")

Estoesmuytilparadejarregistroenlog/sobreciertossucesosimportantesdelavidadela
aplicacin.Yousoestosregistrosparamonitorearmomentoscrticos,comociertasnoches
enquemisservidoressincronizansusbases.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag112/197actualizadoal06/01/13

Captulo8
Captulo 8: Validaciones
Validaresunpasoaburridoduranteeldesarrollodetodaaplicacin.Suobjetoesimpedirla
entradadedatosquecorrompanlabase.No,nosetratadedinero.Setratadevalores
vacos,repetidos,letrasenlugardenmeros,etc.Desgraciadamente,esunpasoquelos
programadoresdebenhacerloporduplicadoentodaslasetapasdelaaplicacin:durante
losnew,losedit,etc.
RailshabamosmencionadoqueseadscribealmodeloDRY(noterepitas),demodoque
aclaramosnuestraregladevalidacinenelmodelo,yActiveRecordcuidarquenunca
ingresendatossucios.
Abrimosapp\models\company.rb,ylodejamosdelasiguienteforma:
class Company < ActiveRecord::Base
validates_uniqueness_of :name, :message => "Esta empresa ya existe en base"
validates_presence_of :name, :message => "necesito un nombre"
validates_presence_of :address
end

Vaya!Esofuemuyrpido!
YsiUd,miqueridoprogramador
dePHPestlagrimeandodela
emocin,busqueotropauelo,
eintenteeditarunregistroy
borrarelvalorenaddress.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag113/197actualizadoal06/01/13

Captulo9
Captulo 9: La imagen no es nada: Layouts y CSS
Loslayoutsserendereanantesquelasvistas,ytcnicamente,las"envuelven".
Sirvenparaalojarbarrasdebotones,encabezados,publicidad,etc.Porcadacontrolador
generadomediantescaffold,hayunlayoutgeneral.Ysideseamos,podemoscrearun
layoutgeneral,yhacerquetodosloscontroladoresbusquenalmismoantesderenderear
susvistas.
Loslayoutssonopcionales,peronosaligeraneltrabajodetenerquedisearestos
elementosenCADAcomponenteABM.
Porejemplo,paratodaslasvistasalojadasenapp/views/movies,existirunlayouten
app/views/movies/movies.html.erb
Deestamanera,loslayoutssonunasolucinelegante,quehastaahorasolosehaba
solucionadoconframes,maspropiosdelosaos90,omediantelasplantillasde
Dreamweaver(noCSS,ydependientesdeesteonerosoeditor).
Enunalardedemetrosexualismo,loscreadoresdeRailsdisearonloslayoutsparaquese
conectaranalasvistasmedianteDIVs(porCSS),ynomediantetablas.
Esto,enunprincipioresultamolesto,yaquedebemosentenderunpocodeplantillasCSS.
Sinembargo,esunacorrectaprcticadeprogramacin.
CitandoallibroIntroduccinaCSS,escritoporJavierEguluzPrez,ypresentegratuitamente
enwww.librosweb.es:
"Eldiseodelaspginaswebhabitualessedivideenbloques:cabecera,men,contenidos
ypiedepgina.Visualmente,losbloquessedisponenenvariasfilasycolumnas.Poreste
motivo,hacevariosaoslaestructuradelaspginasHTMLsedefinamediantetablas.
EldesarrollodeCSShapermitidoquesepuedanrealizarlosmismosdiseossinutilizartablasHTML.Las
principalesventajasdedisearlaestructuradelaspginaswebconCSSenvezdecontablasHTMLson
lassiguientes:

Mantenimiento:unapginadiseadaexclusivamenteconCSSesmuchomsfcilde

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag114/197actualizadoal06/01/13

mantenerqueunapginadiseadacontablas.Cambiarelaspectodeunapginacreada
conCSSestanfcilcomomodificarunaspocasreglasenlashojasdeestilos.Sinembargo,
realizarlamismamodificacinenunapginacreadacontablassuponeunesfuerzomuy
superioryesmsprobablecometererrores.

Accesibilidad:laspginascreadasconCSSsonmsaccesiblesquelaspginasdiseadascon
tablas.Dehecho,losnavegadoresqueutilizanlaspersonasdiscapacitadas(enespeciallas
personasinvidentes)puedentenerdificultadesconlaestructuradelaspginascomplejas
creadascontablasHTML.Noobstante,disearunapginawebexclusivamenteconCSSno
garantizaquelapginaseaaccesible.

Semntica:aunqueresultaobvio,lastablasHTMLslosedebenutilizarparamostrardatoscuya
informacinsloseentiendeenformadefilasycolumnas.Utilizartablasparacrearlaestructura
completadeunapginaestanabsurdocomoutilizarporejemplolaetiqueta<ul>paracrear
prrafosdetexto.

Porestosmotivos,laestructurabasadaentablashadadopasoalaestructurabasadaexclusivamente
enCSS.AunquecrearlaestructuradelaspginassloconCSSpresentaenocasionesretosimportantes,
engeneralesmssencillayflexible."

nimo!Noestandifcil:enhttp://del.icio.us/karancho/cssmencionovariasfuentesde
inspiracin,generacindelayouts,menes,ytodolonecesarioparaaprender
rpidamentediseoseinterfacesprofesionales.

Actividades
1)Entreahttp://www.bunker.org.ar/incubadora/LibroRails3
2)Descargueelarchivolayouts_css_imagenes_extras.rar
3)Descomprimaelcontenidosobrelarazdesuproyecto
Concretamente,asegresequemiscarpetas

app

public

sobrescribanlassuyas.
4)Noserademipatticodiseo.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag115/197actualizadoal06/01/13

Concretamente,elarchivocomprimidocontiene:
Archivoejemplo
app\models\company.rb

Explicacin
Lasvalidacionesqueyavimos.
Ciertaszonas(<div>)queRails"renderea"antesque

app\views\layouts\companies.html.erb

lasVistas(edit.html.erb,index.html.erb,new.html.erb,
etc.)

public\images\avatar_sergio.png
public\stylesheets\sergio.css

Laimagendearribaalaizquierda.
Desarrollodelaszonas(<div>)solicitadasporellayout.
Estoesubicacin,margenes,colores,etc

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag116/197actualizadoal06/01/13

Captulo10
Captulo 10: Uno para Todos...
"Encuentrauntrabajoqueteguste
ynovolversatrabajar
niunslodadetuvida".
Confucio

EnestafaseahondaremosenalgunosaspectosmasavanzadosdeRails.
Deboadmitirquetodoloquehabamoslogradohastaahora,lopodramoshaberrealizado
enPHP,sintenerqueaprenderunlenguajenuevo.
Muchosprincipiantesprefierentrabajardesdeelprincipioenformacasiartesanal(PHP/
ASP),paradescubrirqueunproyectopuedecrecerhastahacersemuydifcildemantener.
Cuandoenunproyecto,sustablas,relaciones,tiempodecarga,etc,comienzanacrecer,
escuandolosframeworksdemuestransuvala.TradicionalmenteseemigraaJava/.NET,
conellargusimoeintensoentrenamientoqueestosupone,almenosde1ao,y
practicandocomounviolinista(17).
Afortunadamente,enestosltimosaosPython(conDyango),yRuby(conRails,Sinatray
otros)hantradoopcionesfrescas,originalesypotentesalmundodeldesarrolloweb.
EnelmundodelosframeworkswebreinanindiscutiblementeJava(Struts,Spring,JSF),
debidoasucomprobadaflexibilidadyrobustez.
Sinembargo,estosltimosaos,losmismosprogramadoresquepasansusemanalaboral
enJavay.NET,seconectanlosfinesdesemanaalosforosdePythonyRuby,locualindica
uninminentecambiodeparadigma.Losmoderadoresdelosforosconcuerdan:almenos,
programarenRubyyenPythonesdivertido18.

17 Aproximadamente4(cuatro)horasdiarias.
18 Fuente:http://www.vivalinux.com.ar/articulos/pythonyrubymasdivertidos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag117/197actualizadoal06/01/13

Tablas Combinadas
Lascompaasposeenmasdeundepartamento:Ventas,AtencinalCliente,etc.
Generaremosmodeloycontroladordedepartamentosenunsolopaso:

rails generate scaffold department company_id:integer name:string


ruby script\rails generate scaffold department company_id:integer name:string

Siobservamoslasalidagenerada,veremosqueRailshageneradoarchivosparacuando
estemoslistospara"migrar",estoes,crearenelmotorSQLunreflejofuncionaldenuestro
modelo.
exists

app/models/
exists

app/controllers/

exists

app/helpers/

create

app/views/departments

exists

app/views/layouts/

exists

test/functional/

exists

test/unit/

exists

test/unit/helpers/

exists

public/stylesheets/

create

app/views/departments/index.html.erb

create

app/views/departments/show.html.erb

create

app/views/departments/new.html.erb

create

app/views/departments/edit.html.erb

create

app/views/layouts/departments.html.erb

identical

public/stylesheets/scaffold.css

create

app/controllers/departments_controller.rb

create

test/functional/departments_controller_test.rb

create

app/helpers/departments_helper.rb

create

test/unit/helpers/departments_helper_test.rb

route
dependency

map.resources :departments
model

exists

app/models/

exists

test/unit/

exists

test/fixtures/

create

app/models/department.rb

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag118/197actualizadoal06/01/13

create

test/unit/department_test.rb

create

test/fixtures/departments.yml

exists

db/migrate

create

db/migrate/20100113040955_create_departments.rb

Concretamente,yentremuchasotrascosas,hageneradounarchivo
db/migrate/2009nnnnnnnnnnn_create_departments.rb

Leledamosunamirada,ychequeamosqueapareceuncampo(creadopornosotros
duranteelscaffold)llamadoapropsitocompany_id:integerestosignificadoscosas:

Debeexistirunaclase(modelo)Companyporalgnlado.Elscaffoldlahacreado
pornosotrosenapp\models\department.rb

SegnlaconvencindeRails,cuandomencionamosuncampoterminadoen_id,es
porqueloestamosdeclarandocomoclaveexternadeotratabla.

rake db:migrate

==

CreateDepartments: migrating ==============================================

-- create_table(:departments)
-> 0.0054s
==

CreateDepartments: migrated (0.0059s) =====================================

Oalgoas...

Esdecirqueporabajo,simiramoselarchivolog\development.log,nosencontraramosuna
charlaentreActiveRecordyelmotorSQLite,detipoCREATETABLE,etc.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag119/197actualizadoal06/01/13

Formalizar la relacin
Sibienhemosestablecidolarelacinentreambastablas,mencionandoelndicedeuna
comoclaveajenadeotra,nohemosaclaradosiesunarelacindeUnoaUno,deUnoa
Muchos,odeMuchosaMuchos.
Lapresenteexplicacintieneporpropsitointroducirsoloalosejemplosaqupresentados.
ParaverunamuycompletaguasobrelasrelacionesentrelosmodelosdeActiveRecord,
serecomiendaenfticamenteconcurriralaexcelenteguapresenteen
http://guides.rubyonrails.org/association_basics.html

Entrminosgenerales,abrimosambosmodelos,ylesexplicamosaRailsqueunacompaa
puedetenervariosdepartamentos.Entantoqueundepartamentoperteneceraunasola
compaa.
Sirecuerdanlasreglasdeintegridadreferencial,recordarnelviejoadagio"enunarelacin
deUnoaMuchos,laclavedelosunos(Compaa)seencuentradelladodelosmuchos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag120/197actualizadoal06/01/13

(Departamentos).Estaeslaraznporlacualundepartamentoposeeuncampo
company_id.Yloaclaramosmediante"belongs_to".

Lohacemosenlacarpetaapp\models.Enestacapturadepantalla,gvimeditaambos
modelosalavez.

Integridad Referencial
Fuente:http://guides.rubyonrails.org/migrations.html,accedidoelsbado,21dejuliode
2012
Unapreguntaquesehacentodoslosprogramadoresquellegandeotroslenguajes,es
comomanejaRailslaintegridadreferencial.Alfinaldelvinculomencionado,David
HeinemeierHanssonmencionaquedesdeelpuntodevistadeActiveRecord,ydemediar
bienlasvalidacionesenlosmodelos,nohacefalta.Dehechoenlaguaoficialde
asociaciones,http://guides.rubyonrails.org/association_basics.html,mencionaalgunos
trucos.Porejemplo:

classCustomer<ActiveRecord::Base

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag121/197actualizadoal06/01/13

has_many:orders,:dependent=>:delete_all,:validate=>:false
end

Aqusepuedeobservarcomoencasoqueseborreuncliente,seborrantodassusfacturas
asociadas.Finalizaeldocumento,mencionandoquesidetodasmanerasdesea
implementarintegridadreferencialaniveldebasededatos,recomiendausar
http://github.com/harukizaemon/redhillonrails/tree/master/foreign_key_migrations/
EnelREADMEdeestagemaseexplicacomogenerardesdelasmigracionesclavesajenas,
coninstruccionesondelete,onupdate,etc.
Personalmentepudecomprobarlavalidezdeforeign_key_migrations,yaquesiempreme
hainquietadocompartirlabaseconprogramadoresquedesarrollenenotroslenguajes:la
basedeberaprotegerseasmismoanteregistroshurfanosoduplicados.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag122/197actualizadoal06/01/13

Jugar con Tablas Combinadas en Rails Console

Estandoambastablascreadas,esunabuenaocasinparaversielmodelorespondea
nuestrasexpectativas.Tambinesunamuybuenaformaparadetectarerroresdediseo.
1.CreamosunaCompaaytomamosnotadesundice,creadoautomticamente.Por
ejemplo:3
2.CreamosunDepartamento,yenelcampocompany_id,fijamoselvalor3
3.CuandoqueremossaberaquecompaaperteneceunDepartamento,enlugarde
realizarun
SELECT companies.name
FROM companies, departments
WHERE companies.id = departments.companies_id
simplementeinstanciamosun
objetodetipoDepartament.Una
desuspropiedadesesla
Companyalaquepertenece.A
estoselellamaexpresarloen
formadeORM.

Sibienestospasoslospodemoshacer
creandocadaregistroenelSQLite
Manager,convieneaprendera
escribirloenformatoORM,yaqueaslo
expresaremoscuandoprogramemos
controladores.Paraellollamamosauna
versindelIRB(elinteractiveRuby)ya
precargadoconlaclaseActiveRecord
ysusherencias...nuestrosmodelos.
EstoseleconocecomolaRails

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag123/197actualizadoal06/01/13

Console.
Observaratentamenteel"chateo"conelmodelo.Podemosjugarasercontroladoresantes
desentarnosaprogramar.
AqupodemosverlospasosrealizadosenunRailsConsole.

Observarlasordenesintroducidas,comenzadascon>>
ObtenemoslaRailsConsoleenlarazdelproyecto,mediantelaorden
ruby script/rails console
rails console

Querido diario...
PorabajoestnocurriendolasverdaderastransaccionesSQL.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag124/197actualizadoal06/01/13

Enestacapturaseestutilizandotailmediantecygwinparaleerlatrazadelsistema,desde
elarchivolog/development.log
PuedeutilizarseensulugarTailXP,oelmismonotepaddeWindows,aunqueesteltimono
actualizaentiemporealloscambiosqueRailsvaescribiendosobreestearchivo.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag125/197actualizadoal06/01/13

Partials
Lospartialsseutilizanparaformulariosmuygrandes,endondeesmuylaboriosomantener
actualizadoslosmismoscampos(nombre,apellido,direccin,dni,cuit,edad,etc)encada
formularioNew,yencadaUpdate.
Simplementecreamosunarchivo"parcial",comnaambosarchivos,queesllamadoy
renderizadoenmediodelaejecucindeedit.html.erbydenew.html.erb.Lospartialllevan
unguinbajo"_"paraseridentificados.

Partials "a mano"


1)Abrimosapp/views/departments/edit.html.erb,ycortamoslaseccin:
<% form_for(@department) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>
<p>
<select name="department[company_id]">
<% @companias.each do |cia| %>
<option value="<%= cia.id %>"
<%= 'selected' if cia.id == @department.company_id %> >
<%= cia.name %>
</option>
<% end %>
</select>
</p>
<p><%= f.submit "Update" %></p>
<% end %>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag126/197actualizadoal06/01/13

Lapegamosenunarchivonuevo,ubicadoenapp/views/departments/quellamaremos
_form.html.erb
Elultimoprrafoquedice"Update"locambiamosporalgomasgenrico:"submit".
Yenapp/views/departments/edit.html.erb,lodejamosdelasiguientemanera:

<h1>Editing department</h1>
<%= render :partial => 'form' %>
<%= link_to 'Show', @department %> |
<%= link_to 'Back', departments_path %>

Probamossiandatodobien.Ahora,paraqueelformulario"New"sebeneficietambinde
cualquiercambioenelpartial,recuerdeactualizarapp/views/departments/new.html.erb

Ahhh rompi algo!


Nosepreocupe,pidaunscaffoldsolodevistasycontroladorbasadoenelmodelo
existente:
rails generate scaffold_controller Department company_id:integer name:string
ruby script\rails generate Department company_id:integer name:string

Yhablandodepartials,siprestaatencinalasalidadescaffold_controller,adiferenciade
scaffold,notarqueestescriptutilizapartials.Supongoquehaciendoincapienla
diferencia,porpropsitoseducativos.
Porcierto,scaffold_controllernogeneramigraciones(puestoquenocreamodelos)ni
agregarutasaconfig/routes.rb

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag127/197actualizadoal06/01/13

Me olvid de agregar unos campos! scaffold_controller


Qusucedesicreamosnuevoscampos(columnas)enlabasededatos?.
Idealmente:creeomodifiquetodoloquequiera.Perohgalomediantemigraciones,afin
demanteneractualizadalaespinadorsaldelsistemademodelos:elarchivodb/schema.rb
Paraelejemplodelascompaas,lospasosseran:
rails generate migration AddCuitToCompany cuit:string
ruby script\rails generate migration AddCuitToCompany cuit:string
exists

db/migrate

create

db/migrate/20100111170149_add_cuit_to_company.rb

Porcuriosidad,revisemoselarchivocreado:
*************************************************
class AddCuitToCompany < ActiveRecord::Migration
def self.up
add_column :companies, :cuit, :string
end
def self.down
remove_column :companies, :cuit
end
end
*************************************************

Corremoslamigracin,paraquesetomenloscambiosenlaestructuradelabase:
rake db:migrate
==

AddCuitToCompany: migrating ===============================================

-- add_column(:companies, :cuit, :string)


-> 0.0028s
==

AddCuitToCompany: migrated (0.0032s)

El problema
Sibienmodelosycontroladoresestnactualizados,lasvistasnoloestn,yporlotanto
seguirnmostrandoloscamposantiguos.As,tendremosquecrearmanualmentelos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag128/197actualizadoal06/01/13

nuevoscampos,editandolasvistas.Sisomosvagos,yqueremosevitarestepaso,podemos
recurrirnuevamenteascaffold_controllerparamantenertodoactualizado:

rails generate scaffold_controller Company name:string address:string


active:boolean cuit:string
ruby script\rails generate scaffold_controller Company name:string
address:string active:boolean cuit:string

Comosepuedeapreciar,selepasa
comoargumentoloscamposexistentes,
yelnuevocampo.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag129/197actualizadoal06/01/13

Uno a muchos => Combo SELECT, Radio Buttons


Lascajasselectspuedenexpresarseenformaesttica,oenformadinmica(tomando
datosdesdelabase).Laformaestticaseraequivalentea
<% @department.name = "Sede Central"%>
<%= select "department","name",["Ventas","RRHH","etc" %>
Enelcasodeladinmica,necesitamostenerunarelacinhas_manyenelmodelo,yuna
variablerepetidavariasvecesenelcontrolador.Larelacinyalatenemos,demodoque
enelcontrolador[app/controllers/departments_controller.rb],concretamenteen
lasaccionesaccionesedit, new, update y create.Enellascreamosunatributo
llamado@companies,compuestoporTODASlascompaasqueleproporcione
ActiveRecord.
Selocreacon@adelanteparaquelasvistastambintenganacceso.
@companies = Company.all
Recuerderealizarestepaso.Deotramanera,elformulariodispararelsiguienteerror
cuandodevuelvalosdatosalasaccionesupdateocreate:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.map
AhoraelcdigodelSELECTdesplegable.
Enelpartial,[app/views/departments/_form.html.erb],lodejamosparecidoa
<%= error_messages_for 'department' %>
<!--[form:department]-->
<div>
<select name="department[company_id]">
<% @companies.each do |cia| %>
<option value="<%= cia.id %>"
<%= 'selected' if cia.id == @department.company_id %> >
<%= cia.name %>
</option>
<% end %>
</select>
<%= f.label :name %><br/>
<%= f.text_field 'name' %>
</div>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag130/197actualizadoal06/01/13

<!--[eoform:department]-->

Muchocdigo?laultimamodaenRails!:unhelper.Lograel<SELECT>anteriorcon...una
solalnea.ProbablementenosellevebienconAjax,peroesbastantesinttica.

<%= f.select :company_id, @companies.map {|cat| [cat.name, cat.id]} %>

TerceraformaderealizarlacajadelSELECT(nofuncionaconpartials):
<select id="department_company_id" name="department[company_id]">
<%= options_from_collection_for_select @companies, "id", "name",
@company.department_id %>
</select>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag131/197actualizadoal06/01/13

ORM... de nuevo
Recordemos:entodoORM(ObjectRelationalMap),lasclasesmapeantablas,losatributos
aloscampos,losmtodosalasacciones,yunobjetopuedeserunregistroounacoleccin
deellos.
Abrimosunaconsolairbmedianteelcomando
rails console
ruby script/rails console

yprobamos
1.Crearunobjetodeptosquerepresenteunacoleccindetodoslosregistrosdisponibles
2.Loiteramos.Esdecir,lorecorremos,mostrandoconelcomandop(putsparaholgazanes).
deptos=Department.find(:all)
==> [#<Department id: 1, company_id: 1, name: "Secretaria Academica",
created_at: nil, updated_at: nil>, #<Department id: 2, company_id: 3,
name: "Maestranza", created_at: "2009-05-18 06:41:12", updated_at: "200905-18 06:41:12">]

irb --> deptos.each do |i|


\-+ p i.name
>> end
"Secretaria Academica"
"Maestranza"
deptos[1].name
==> "Maestranza"

Tambinlopodramoshaberrecorridoconunfor,undoloop,etc.Perohorrorizaraa
cualquierprogramadordeRuby.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag132/197actualizadoal06/01/13

Tengo muchas tablas, ndices y campos!


Estrategia 1
Crearautomticamentediagramasdemodelosycontroladores
Enunafaseavanzadadelproyecto,puedeconfundirnosla
cantidaddetablasmodelosycontroladoresinteroperandoentre
s.Algunoseditorespagos,comoelexcelenteRubymine,poseen
unmapaderutamuybuenoenestesentido.Sinembargo,
podemosseguirmantenindonos"libres",yusarRailroadensu
lugar.

sudo apt-get install graphviz

sudo gem install railroad

Pararesolverdependenciasnecesarias:consultar

http://jacqueschirag.wordpress.com/2007/08/09/visualizeyourrailsdatabase
schemaforfreeonwindows

gem install railroad

Paragenerarlosgrficossobremodelosycontroladores:

railroad -M | dot -Tsvg > modelos.svg


railroad -C | dot -Tsvg > controladores.svg

Oparagenerararchivospng:
railroad -M | dot -Tpng > modelos.png

Enlacarpeta,deberaaparecerundiagramadelosmodelosyotrodeloscontroladores.El
formatoes.svg,esdecirvectorialxml,formateableconcualquierherramientadedibujo
comoInkscape,CorelDraw,Ilustrator,etc,einclusouneditordetextos!

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag133/197actualizadoal06/01/13

Sepuedecambiarlacadenasvgporpng,masportable.Peroentantoquesvges
fcilmenteformateablemediantelosprogramasmencionados,losarchivospngrequieren
detodaclasedemaquillajeporpartedealgnprogramadeedicindefotos.
Sialgofalla,esporquenoestnbientrazadaslasrdenesbelongs_to,has_many,etc.

Parapodervisualizarlosdiagramasenformatosvg:
NotasrespectodeWindows:

InstalarpluginSVGdeAdobeparanavegadoresExploreryFirefox:
http://www.adobe.com/svg/viewer/install/

NotasrespectodeLinux:

Parasolamenteverlosarchivos
creados,sepuedellamar
simplementealpropioviewerde
imgenesdegnome(Ejemplo:
eog modelos.svg).

Paraeditar,agregarttulos,
etiquetas,comentarios,abrircon
inkscape(apt-get install
inkscape).

Mas info: http://railroad.rubyforge.org

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag134/197actualizadoal06/01/13

Estrategia 2
AnnotateModels
Cuandoelproyectoavanzamucho,loscreadoresderailsrecomiendanutilizarunplugin
quesimplementevaanotandodentrodelosmodelos,loscamposquevamosutilizando.
Estosedebeaquecuandovaprogresandoelcdigo,recurrimosfrecuentementeal
modeloparacambiarcosas.Ytodoeltiempovamosalabasearevisarloscampos
existentes.Esunejercicioaburrido.
Ejemplodeinstalacin,directamentedesdelapginadesuscreadores:
sudo gem1.8 install annotate

gem install -rV annotate

Alternativamente:entrarahttp://github.com/ctran/annotate_models
Ahorasi:paradejaramanolosnombresdecampos,dentrodelosmodelos:
rake annotate_models
Annotating Company
Annotating Department

Siahoramiramosdentrodeapp\models\company.rb...magia!
#********************************************************************
# == Schema Information
# Table name: companies
#
#

id

:integer

name

:string(255)

address

:string(255)

active

:boolean

created_at :datetime

updated_at :datetime

not null, primary key

class Company < ActiveRecord::Base


has_many :departments
end

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag135/197actualizadoal06/01/13

#*********************************************************************

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag136/197actualizadoal06/01/13

Captulo11
Captulo 11: Muchos a Muchos => Checkboxs
Esunhechoquesienunarelacindeunoamuchos,larepresentacinserunacaja
desplegableSELECT,(ounosRADIO),encambioenunarelacindemuchosamuchos,su
representacinsernlosCHECKBOX.
Railsescapazdemanejardevariasformaslasrelacionesmuchosamuchos.Aquveremos
laformamassimple,lahas_and_belongs_to_many.
Nuevamente...
Lapresenteexplicacintieneporpropsitointroducirsoloalosejemplosaqupresentados.
ParaverunamuycompletaguasobrelasrelacionesentrelosmodelosdeActiveRecord,se
recomiendaenfticamenteconcurriralaexcelenteguapresenteen
http://guides.rubyonrails.org/association_basics.html

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag137/197actualizadoal06/01/13

Supongamosqueenlacompaa,variosdepartamentoscolaboranpararesolveralgunos
proyectos.

Cargar departamentos
Estepasopuederealizarlomediantefixturesquetodavanovemos),cargardirectamente
usandoelManagerdeSQLite,omedianteelABMdedepartamentosquehabamoshecho
conRails,esdecir:
1. Lanceelserverdepruebas
rails server

2. Enhttp://localhost:3000/departmentscarguelosdepartamentos:

Estadsticas

RRHH

Auditora

Administracin

Mercadeo

Finanzas

Investigacin

Ventas

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag138/197actualizadoal06/01/13

Esdecir,deberateneralgoparecidoalacapturadepantalla:
3. Upps,enlaprimercolumna,enlaquediceCompany,figuraelcompany_idenlugar
delnombredelacompaa.Algoqueconotrosframeworkstardaramosunratoen
arreglar,conRailsestansimplecomo

Abrirapp/views/departments/index.html.erb

Cambiamoslalneaquedice
<td><%=h department.company_id %></td>

porotraquediga
<td><%=h department.company.name %></td>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag139/197actualizadoal06/01/13

Creacin del ABM de proyectos


Si,adivinan.
rails generate scaffold Project name:string description:string
ruby script\rails generate scaffold Project name:string description:string

rake db:migrate

Enhttp://localhost:3000/projectscargamosdosproyectosconloscualesjugar:

Reducircostos

Identificarnichosdemercado

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag140/197actualizadoal06/01/13

Crear tabla relacin


Necesitamosunatabla"relacin",queconservelosiddeaquellastablasconlasque
queremosiniciarlarelacinmuchosamuchos:

rails generate scaffold departments_projects project_id:integer


department_id:integer
ruby script\rails generate scaffold departments_projects project_id:integer
department_id:integer

Railstiendeacrearpornosotrosuncampoidparalapropiatabla.Sinembargo,eneste
caso,loevitaremos,yaquelosindices(masadelante)sernlasclavesajenasproject_idy
department_id.
Porestarazn,antesdemigrar,introduciremoslossiguientescambios(enrojo)enelarchivo
demigracindb/migrate/20100116190300_create_projects_departments.rb

class CreateProjectsDepartments < ActiveRecord::Migration


def self.up
create_table :projects_departments, :id => false do |t|
t.integer :project_id

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag141/197actualizadoal06/01/13

t.integer :department_id
t.timestamps
end
end
def self.down
drop_table :projects_departments
end
end

Ahorasi,corremoslamigracin:
rake db:migrate
==

CreateProjectsDepartments: migrating ======================================

-- create_table(:projects_departments, {:id=>false})
-> 0.0050s
==

CreateProjectsDepartments: migrated (0.0055s) =============================

Formalizamos la relacin entre las tablas


Enapp/models/department.rb

class Department < ActiveRecord::Base


belongs_to :company
has_and_belongs_to_many :projects
end

Yenapp/models/project.rb
class Project < ActiveRecord::Base
has_and_belongs_to_many :departments
end

Controlar la relacin

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag142/197actualizadoal06/01/13

AlosprogramadoresdeRubylesgustamuchoprobarantesdeprogramar.Todavano
entramosarspec,cucumberyotrasherramientasparahaceralgoas,peroigualmente
podemosdescubrirerroresenlosModelosquehemosdiagramado,antesdeecharlela
culpaalosControladoresoalasVistas.

Testeo rpido mediante diagramas automticos


Medianteelyavistopluginrailroad,omedianteeleditorrubymine,realizamosundiagrama
delosmodelos.
Siestosprogramasnodibujanlarelacin,
osecuelgan,nosestamosequivocandoenalgnpaso.
Revisemaysculas,singulares,pluralesutilizadoseneltutorial.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag143/197actualizadoal06/01/13

Testear relacin mediante la consola de Rails + HIRB


Avisoparaimpacientes
Acontinuacinsepresentancuatrohojasdecomandos,queayudarnaentenderla
maneraenqueseutilizarActiveRecorddesdeloscontroladores.LaconsoladeRails,yel
miniframeworkHIRBsonunaespeciedepolgonodetiroparadebuggers,testeadores,y
programadoresnovatos.
Sidesea,puedesaltearestaparteyavanzardirectamentealaconstruccindelos
CHECKBOX.
Recuerdequeenlasprximashojas,amedidaquevaestableciendorelacionesmuchosa
muchos,puedeircontrolandotodomediantealgunodelosmanagersdeSQLite
recomendadosenelMdulo1:Instalacin.Aqusemuestrasqlitebrowser.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag144/197actualizadoal06/01/13

Enlarazdelaaplicacin,lanzamosunaversindeirbqueprecargalosmodelos,ylos
heredaconrespectoalasuperclaseActiveRecord.
rails console
rails console

Loading development environment (Rails 2.3.5)


Welcome to interactive ruby!
irb -->

Creando proyectos desde consola

Asignamosunproyectoparaquesearealizadopordeterminadosdepartamentos.Siun
proyectonoexistean,inclusolopodemoscrearaqu.
irb --> proyectoColas = Project.new
==> #<Project id: nil, name: nil, description: nil, created_at: nil,
updated_at: nil>
irb --> proyectoColas.name = 'Colas de espera'
==> "Colas de espera"
irb --> proyectoColas.description = 'Reducir colas de espera'
==> "Reducir colas de espera"
irb --> proyectoColas.save
==> true
irb --> proyectoColas.id
==> 5

Muybien!Hemoscreadounproyectomediantelaconsola,ysinusarSQLnilasvistas.
Fabriquemosotroproyecto.Soloporcuriosidad,realizaremostodaslasinstrucciones
anterioresusandosoloUNAlnea,utilizando.createenlugarde.new+.save

irb --> proyectoObsoletos = Project.create (:name => 'Obsoletos', :description =>


'Identificar compus obsoletas para donarlas')
==> #<Project id: 6, name: "Obsoletos", description: "Identificar compus
obsoletas para donarlas", created_at: "2010-01-18 04:03:23", updated_at: "2010-

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag145/197actualizadoal06/01/13

01-18 04:03:23">

Yatenemosdosproyectos,quesesumanalosotrosdosquehabamoscargadodesde
http://localhost:3000/projects,recuerdan?eran:

Reducircostos

Identificarnichosdemercado

Podemosconstatarcuantosproyectostenemos,usandounfor(comoenelMdulo2:
Introduccin),omedianteuniterador.VamosausarelestiloRuby,eliterador.
Atencinalasnegritas:

irb --> Project.find(:all).each do |p|


\-+

puts p.name

>>

end

Reducir Costos
Identificar nichos de mercado
Colas de espera
Obsoletos
(un montn de otras cosas)
==>

Delamismaforma,podemosvercuantosdepartamentosfiguranenbase
irb --> Department.find(:all).each do |d|
\-+

puts d.name

>>

end

Estadsticas
RRHH
Auditora
Administracin
Mercadeo
Finanzas
Investigacin
Ventas
(un montn de otras cosas)
==>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag146/197actualizadoal06/01/13

Buscando cosas en consola

Ejercicio:enelproyecto"Colasdeespera",cuyoobjetoinstanciadoesproyectoColas,se
deberaninvolucrartodosaquellosdepartamentosdondeseproducenlargasesperasde
personas.EstossonlosdepartamentosVentasyAdministracin.
Instanciemoscomounobjetollamadoventas,quereferencieaquelregistroqueposeael
departamentoVentas.Siconocemossuid,podemosusar:

irb --> ventas = Department.find(10)


==> #<Department id: 10, company_id: 1, name: "Ventas ", created_at: "201001-16 18:22:18", updated_at: "2010-01-16 18:22:18">

Sinoconocemossuid,podemosbuscarlocomocadena:

irb --> ventas = Department.find(:all, :conditions => " name like '%Ventas%' ")
==> [#<Department id: 10, company_id: 1, name: "Ventas ", created_at: "201001-16 18:22:18", updated_at: "2010-01-16 18:22:18">]

AsignemosalagentedeVentas,alproyectoColas:

irb --> proyectoColas.departments << ventas


==> [#<Department id: 10, company_id: 1, name: "Ventas ", created_at: "201001-16 18:22:18", updated_at: "2010-01-16 18:22:18">]

BusquemosAdministracin,yasignemostambinaColas:
irb --> adm = Department.find(:all, :conditions => " name like '%Administrac%' ")
==> [#<Department id: 6, company_id: 1, name: "Administracin ", created_at:
"2010-01-16 18:20:53", updated_at: "2010-01-16 18:20:53">]
irb --> proyectoColas.departments << adm
==> [#<Department id: 10, company_id: 1, name: "Ventas ", created_at: "201001-16 18:22:18", updated_at: "2010-01-16 18:22:18">, #<Department id: 6,
company_id: 1, name: "Administracin ", created_at: "2010-01-16 18:20:53",
updated_at: "2010-01-16 18:20:53">]

VeamoscuantosdepartamentosseencuentranasignadosalproyectoColas.
irb --> proyectoColas.departments.count

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag147/197actualizadoal06/01/13

==> 2

Cules?
irb --> proyectoColas.departments
==> [#<Department id: 10, company_id: 1, name: "Ventas ", created_at: "201001-16 18:22:18", updated_at: "2010-01-16 18:22:18">, #<Department id: 6,
company_id: 1, name: "Administracin ", created_at: "2010-01-16 18:20:53",
updated_at: "2010-01-16 18:20:53">]

O,mejorpresentado:
irb --> proyectoColas.departments.each do |x|
\-+

puts x.name

>>

end

Ventas
Administracin

(yunmontndebasura)

HIRB

Realmentelasalidareciente
irb proyectoColas.departments
==> [#<Department id: 10, company_id: 1, name: "Ventas ", created_at: "201001-16 18:22:18", updated_at: "2010-01-16 18:22:18">, #<Department id: 6,
company_id: 1, name: "Administracin ", created_at: "2010-01-16 18:20:53",
updated_at: "2010-01-16 18:20:53">]

sevebastantedesordenada.Enregistrosconmuchoscamposcuestaencontrarlas
cosas.MejoraremosunpocolapresentacinmedianteunpluginllamadoHIRB.
BajoUbuntuyRails3,instalamoselpluginmediante:
gem install hirb
sudo gem1.8 install hirb

Luegoagregamoslassiguienteslneasanuestroarchivo$HOME/.irbrc
Estascargarnhirbencadallamadaairb,yconsecuentementearailsconsole:
require 'rubygems'

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag148/197actualizadoal06/01/13

require 'hirb'
extend Hirb::Console
Hirb::View.enable

Pruebenlasiguientecombinacin:
rails console
ruby script\console
irb(main):001:0> table ['pepe', 'pipa']
+-------+
| value |
+-------+
| pepe

| pipa

+-------+
2 rows in set
=> true

SitenemosproblemasdeinstalacinbajoWindows,alternativamentepodemosseguirlas
instrucciones"oficiales"quefiguranenladocumentacindelproyecto,yutilizarelinstalador
depluginspropiodeRails3,elcualpermitellegarhastaelmismocorazndelproyecto,y
obtenerlaultimaversinposible.EstepasorequieredetenerGITinstalado.
ruby script/rails plugin install git://github.com/cldwalker/hirb.git

Luego,abrimosunconsolayescribimos.
rails console
irb(main):001:0> require 'hirb'
irb(main):002:0> extend Hirb::Console
irb(main):003:0> Hirb::View.enable

Comentariotilrespectodeplugins:
Sitieneproblemasinstalandoplugins,ynoestasegurosilaconfiguracindeRuby+Railses
compatible,visitehttp://railsplugins.org.Allencontrarunlistadodepluginstesteados
comoestables,esdecir,que"deberanfuncionar".
FIXME:PresentaraquelmismoejemploproyectoColas.departmentsconhirb

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag149/197actualizadoal06/01/13

Ejercicios propuestos

1) Asignaralproyecto"Reducircostos",losdepartamentosdeEstadsticas,RRHH,
Auditora,Administracin,MercadeoyFinanzas.
2) Asignaralrevs:InscribiraldepartamentoInvestigacinenlosproyectos"Identificar
nichosdemercado",y"Obsoletos"

Ahora s: los CHECKBOX


VamosatratarqueenlaaccinEditdelosDepartamentos,cuyavistaasociadase
encuentraenelparcialapp/views/departments/_form.html.erb,muestreunacajasde
seleccincomolasquesepuedeapreciarenlasiguientecaptura:

Elcdigodelparcialeselsiguiente:
<%= error_messages_for 'department' %>
<!--[form:department]-->
<div>
<p>
<%= f.label :name %><br/>
<%= f.text_field 'name'
</p><p>

%>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag150/197actualizadoal06/01/13

<%= f.select :company_id, @companies.map {|cat| [cat.name, cat.id]} %>


</p><p>
<% for project in Project.find(:all) %>
<div>
<%= check_box_tag "department[project_ids][]", project.id,
@department.projects.include?(project) %>
<%= project.name %>
</div>
<% end %>
</p>
</div>
<!--[eoform:department]-->

Cambios en el controlador
Enapp/controllers/departments_controller.rb,alprincipiodelaaccinupdate(laque
recibelosvaloresdelavistaedit),paraevitarelproblemacitadoen
http://asciicasts.com/episodes/17habtmcheckboxesrespectodecuandoningn
checkboxhasidoclickeado,hayqueponeresto:
params[:department][:project_ids] ||= []

Algo mas respecto de las vistas:


Lointeresantedehaberrealizadoloscambiosenelparcial
app/views/departments/_form.html.erbenlugardelavista
app/views/departments/edit.html.erb,esqueahoratambinlavistanewsebeneficiacon
loscheckbox:

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag151/197actualizadoal06/01/13

Y el show? (yapa!)
Lasvistasshownoposeencheckbox,locualeslgico,puestoquenoseenviarndatos.
Peroseratilpodervisualizarenmodo"sololectura"aquellosproyectosenlosquese
encuentraanotadoeldepartamento.Paraellomodificamos
app/views/departments/show.html.erbparaquequedemejorpresentado:

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag152/197actualizadoal06/01/13

<p>
<b>Company:</b>
<%=h @department.company.name %>
</p>
<p>
<b>Department:</b>
<%=h @department.name %>
</p>
<p>
Proyectos relacionados
</p>
<ul>
<% @department.projects.each do |project| %>
<li><%= project.name %> - <%= project.description %></li>
<% end %>
</ul>
<%= link_to 'Edit', edit_department_path(@department) %> |
<%= link_to 'Back', departments_path %>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag153/197actualizadoal06/01/13

Jugando con MVC

AlprincipiohabamoshabladounpocodeMVC.Sinembargo,noesunconceptofcilde
abstraer.Ademas,losscaffoldtiendenamalacostumbrar,demodoquevamosatrabajar
unpocoamano.
Escomnquelaslasaplicacionessedividanenelfrenteo"frontend",yenlatrastiendao
"backend".Esunanglicismoqueseexplicaporsisolo,ytilparaejemplificaraqu.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag154/197actualizadoal06/01/13

Comenzaremosgenerandouncontrolador"frontend"conunaaccin"activas"adentro.Su
funcinsermostraraquellossoloregistrosdecompaasquetengansucampoactive
comotrue.
Esdecir,haremosnuestrapropiaversindelABMdecompanies:
Comoapareceenlacaptura,intentaremossepararvisualmentelasempresassegnsu
campoactive.Tambinlehabilitaremosunbotnalusuarioparaquecambiefcilmenteel
estado,conunsoloclick.Lorealizaremossinusarscaffolds(19):
Usaremosungeneradordecontroladores,cuyousoes
rails generate controller controlador accin1 accin2 accin3
ruby script\rails generate controller controlador accin1 accin2 accin3

Porlotanto,utilizamoslaorden
rails generate controller frontend activas
ruby script\rails generate controller frontend activas

exists

app/controllers/

exists

app/helpers/

exists

app/views/frontend

exists

test/functional/

exists

test/unit/helpers/

create

app/controllers/frontend_controller.rb

create

test/functional/frontend_controller_test.rb

create

app/helpers/frontend_helper.rb

create

test/unit/helpers/frontend_helper_test.rb

create app/views/frontend/activas.html.erb

Siobservamosatentamente,paralelaalaaccinsehacreadounavistaconelmismo
nombre.

Mapear Rutas y Controladores


Loscontroladoresnosonpblicos.Paraesoexistelacarpetapublic/
Sideseamosaccederdirectamentealcontroladorva
19 Miramama!sinmanos!

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag155/197actualizadoal06/01/13

http://localhost:3000/frontend/activas,debemosmencionarloenconfig/routes.rb
map.resources :activas

La Vista
Realizaremosdosdivisiones<div>queocupencadaunalamitaddelapantalla.Estoes
muysimple,ylorealizamosmediantelainclusindecssdentrodel<div>.Alsertan
localizadalanecesidad,puedeperdonarmenomandarheight:50%alarchivo
general.css,yemplearlodirectamenteusandoelmodificadorstyle.
Tambinlepondremosunasimplelneainferioralacajasuperiorparasepararambas.Esto
selograconborderbottom:solid;
Enlugardelosenlaces,usaremosdosbotones:up.png

ydown.png

Encadaunodelos<div>usaremosbuclesmuyparecidos:

<% Company.find(:all, :conditions => {:active => true}).each do |c| %>

y
<% Company.find(:all, :conditions => {:active => false}).each do |c| %>

SirecuerdanelMdulo2:Introduccin,recordarnquelosprogramadoresdeRubygustan
deusariteradores.Enelejemploiteraremoscrearemosymataremosmuchasvecesun
objetoc,queposeetodoslosdatosdelregistro.
Dentrodelosbucles,usaremoslafuncinlink_to,lacualpuedeempleartodaclasede
parmetros.Paranuestrasnecesidadeslesuministraremos:
1. Algoparamostraryconvertirenunenlace:unapalabra,ounaimagen.Las
imgenespuedenvincularsemedianteotrafuncin,image_tag.
2. Datosparaconformarelenlace:enldebemosespecificar
1. Controladorhaciadondevanlosdatos
2. Accinagestionareldato
3. ElIDdelregistroamostrar
3. Confirmacin
Todosestosparmetrospuedenanidarseusandollaves{}

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag156/197actualizadoal06/01/13

Ahoras:copiemoselsiguientecdigodentrodeapp/views/frontend/activas.html.erb
<div id="arriba" style="border-bottom:solid; 1px; height: 50%">
Empresas Activas
<ul>
<% Company.find(:all, :conditions => {:active => true}).each do |c| %>
<li>
<%= h c.name %>
<%= link_to(image_tag("/images/down.png" ),
{ :controller => "frontend",
:action => "activas",
:id => c
}, {
:confirm => "Est seguro?",
}
)
%>
</li>
<% end %>
</ul>
</div>

<div id="abajo" style="height: 50%">


Empresas Inactivas
<ul>
<% Company.find(:all, :conditions => {:active => false}).each do |c| %>
<li>
<%= h c.name %>
<%= link_to(image_tag("/images/up.png" ),
{ :controller => "frontend",

:action => "activas",


:id => c
}, {
:confirm => "Est seguro?",
}
)
%>
</li>
<% end %>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag157/197actualizadoal06/01/13

</ul>
</div>

El Controlador
Elarchivoapp/controllers/frontend_controller.rbcontendr:
class FrontendController < ApplicationController
def activas
if params[:id]
modificar = Company.find(params[:id])
if modificar.active == true
@modificar.active = false
else
modificar.active = true
end
modificar.save
end
end
end

Enestecontroladorrecibimoselid(recuerdanaliteradorc?).Partimosdelasiguienteidea:
siacabandearribardatosdesdelavista(verifparams[:id]),esporqueeloperadorha
hechoclickenalgnenlace.Enestecaso,en

oen

,yporlotanto,deseael

estadodecampotrueporfalse,ofalseportrue.
Primerobuscamosunregistroconese:id,yloinstanciamosenunobjetomodificar
modificar = Company.find(params[:id])

Luegomodificamosenmemoriasucampo
modificar.active=falseomodificar.active=true
yluegologuardamos.
modificar.save

Lavistasedisparaautomticamentecuandolaaccinterminasuejecucin.Mostrando

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag158/197actualizadoal06/01/13

comolaempresacambiaentrecajas<div>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag159/197actualizadoal06/01/13

Captulo12
Server de Produccin
Siseobservaenconfig/databases.yml,severnunaslneasquecorrespondenalabasede
datosqueefectivamentevenlosusuarios.
Enestearchivo,sepuedenapreciartresentornosdetrabajo:development,testingy
production.Cadaunadeestasinstanciassecorrespondendesupropiabase,lascuales
puedeninclusoresidirendistintosmotores.
Deestamanera,yattulodeejemplo,podemosrealizarnuestraspruebasydesarrollosen
ellivianoSQLite;cuandoconsideramosestablesloscambios,losaplicamosenlabase
produccin,donderesideunMySQL,Oracle,MSSQL,PostgreSQL,etc.
Entrminosgenerales,elciclodevidadeundesarrolladorRailsjunioreselsiguiente.
1) Trabajaenmododevelopment
2) Cuandoconsideraquelaaplicacinseencuentraestable,haceunacopiadela
mismaaunacarpetadistinta.
3) Sobrelasegundacarpetacreadaatalpropsito(siusaSQLiteinclusopara
produccin),correlasmigracionesenmodoproduccin.Esdecir,realizaun
rake db:migrate RAILS_ENV="production"

4) ConfiguraApacheparaquesirvalaversinenproduccindesdeestaltima
carpeta.Esdecir,publica.
5) ConfigurasuWindowsparaqueresuelvaelnombredelaaplicacincomolocal.
6) DejainstaladosApachey(Mongrel+AplicacinDemo)comoserviciosdeWindows.
Estoesmuytil,puestoquesidesealiberarciclosdeCPUparacorrerunjuegodeRol,
puededetenerestosservicios.
Veremosmasadelantecomorealizarestepaso,esdecir,configurarelequipoalestilo
deunserverUnix.
EntantoqueundesarrolladorSeniorprobablementerealicelossiguientespasos:
1) Estableceunrepositoriopropio,normalmenteGIToSVN.
2) Trabajaenmododevelopment.
3) Testea:

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag160/197actualizadoal06/01/13

1. Seaseguradetenerfixtures.Porejemplo,sitieneunatablacon4campos,se
aseguradetenerdatosficticiosqueseancargadosporunscriptautomtico
duranteeltesting.
2. Correuncomandoqueseencargadelimpiarlabasetesting,ylareconstruye
(vaca)basadaenlabasedevelopment.
3. Otroscriptcargatodoslosformulariosutilizandolosdatosdelosfixtures,alavez
quepruebaelcdigo.
Eltesteoesmuytilparalasocasionesenquecambiosenalgunapartedela
estructura"ofende"aotrosformularioscuyaestabilidaddamospordescontada.
Estopermitesuperarelengorrodeprobartodalaaplicacincadavez.No
obstante,noesobligatoriotestearenRails.
4) Sipasaloserrores,esdecir,losfixturessecarganexitosamenteenlabasetesting,
informamediantecommitsalrepositoriolocal.Esterepositoriolepermitemantener
variasramasdedesarrollo,einclusorealizarrollbacksentreellas.
5) Invitaaclienteaquepruebeloscambios(:3000)
6) Enelserverdeproduccin,pidequeseconfigureGIT,ApacheyPassenger.Esdecir,
dejaalBOFHacargorascndoselacabeza(20),ylohaceelmismoprogramador.Por
suerte,lamayoradeloshostingsconCPANELactualizadoyatraenconfigurados
estosdaemons.
7) UtilizaalgnscriptautomticocomoCapistrano,queseencargade
1. SubirlaramadedesarrollovaGIToSVN.
2. Clonar(dentrodelserverdeproduccin)lanuevaversindelaaplicacin,enuna
carpetaconfiguradaparaserservidaporApache.
3. Correrlamigracinsobrelabasedeproduccin.
Hastaahorahemostrabajadoenelpuerto3000,conunpequeoservidordepruebas
llamadoWebrick(oMongrel,siseencuentrapresente).Puedenadivinarlarazn:hemos
dejadolibreelpuerto80paralainstanciaproductiondenuestrosistema.Afinesdidcticos,
enfocaremoslasdosformasclsicas:proxyymdulo.

Enlaprimerforma,yparanuestroejemploconWindows,elpuerto80logestionar
Apache,quienescapazdegestionarmilesdeconsultasensimultaneo,yalavez
parsearlasalasdistintasaplicacionesRailsqueconvivanenelmismoequipo.

20 BastardOperatorfromHell.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag161/197actualizadoal06/01/13

Enestasaplicaciones,seencontrarescuchandounpequeoservidorllamado
Mongrel.Medianteunmecanismodeproxy,Apacherealizarlasconsultasa
Mongrel,yseguardaraquellasqueseanfrecuentes.
Estosuponelidiarconalgunasconfiguracionesextras,peronosbeneficiaremosdelas
ventajasdevelocidadquesuponeintercalarunsistemadecachedeconsultas
frecuentes.

BajoLinux,realizaremoslainstalacinmedianteunmodrailsllamadoPhusion
Passenger,elcualdesgraciadamentenoexisteparaWindows.Esunprocedimiento
simple,acordealoscmodosyconfiablesmdulosquelosviejosBOFHacostumbran
aenchufarenApache(21).

Discusin:Linux,Windows,ounCluster?
Sediceque"enLinuxesdifcilhacermuchascosas".Sinembargo,estonoesdeltodo
cierto.Linuxparecehabersidoconstruidoparahacerfcilmentemuchascosasqueen
Windowssondifciles.Estassonsonactividadesquelosusuariosfinalesnohacenamenudo,
yporlotantonoaprecian.
Meexplico,instalarproxys,basesdedatos,daemonsdeversionado,agentesdeacceso
remoto,servidoresweb,debackupodecorreo,sonasuntostriviales,rpidosygratisbajoel
sistemaoperativodelpinginito.
Porestarazn,setiendeatrabajarconlasbasesdevelopmentytestingbajoWindows(o
MACOS/X),yadesplegarlabaseproductionsobreLinux.
LomismosucedeenelmundodePHP.UsualmentelosprogramadoresdePHPpruebanen
Windows,ydeployanenLinuxremotos,contratadosmedianteplanesdehosting.
As,muchosrubystasconsideranqueinstalarunserverenproduccindeRailsenWindows
esmuydifcil,alavezqueinseguro,porlanaturalezamismadeWindows.Intentaremosaqu
demostrarlocontrario(22).
Dejandoclarolosprimerosconceptossobrepublicacin,animaranuestroslectores
palmpedosaquepruebenlarapidezysencillezconlaqueseconfiguraunservicio
equivalentesobreLinux.
21 Enesencia,losadministradoresdeLinux,son(somos)unosvagos.LarazndeaprenderaadministrarLinux...
estenertiempolibredentrodelaempresa.
22 DemostraremosquenoesdifcilmontarunserverdeproduccinenWindows.Noqueseaseguro.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag162/197actualizadoal06/01/13

Finalmente,sinodeseamoscomplicarnosdemasiado,opredecimosunaaltacargasobre
elsistema,veremoscomodesplegarhaciauncloud.Estaformadetrabajaresmuy
cmoda,yaquesepagasolamenteloconsumido,yalavezcontamosconalgunas
comodidadesmuyinteresantes.

Server de Produccin en Windows


ParaelsiguienteejemploutilizaremosInstantRails,elcualyavieneconApacheconfigurado
paraproxearsolicitudesaMongrel.

Preparar Base
1) Comoprimerpaso,copiamoslaaplicacinhaciaotracarpetaquedebeestar
destinadaaproduccin,porejemplo
C:\InstantRails-2.0-win\rails_apps\demo-production

Atenerencuenta:siseencuentrausandoSQLite,yenlacarpetadestinoexisteun
archivodb\production.sqlite3,nolosobrescriba.
2) Enlanuevacarpeta,corremosuncomandoquenospermitecrearlabasede
produccinsiestanoexistiera,orealizarlecambiosensuestructura.Estoscambiosse
correspondenaaquellosquehemosrealizadosobrelabasedevelopment.

Aviso:amenosquerealicenpermanentestestsobrelasmigraciones,hagaun
backupdelabasedeproduccin.EnelcasodeSQLite,estansimplecomoponera
buenrecaudoelarchivodb\production.sqlite3
Atalfin,realiceun
rake db:migrate RAILS_ENV="production"

Estecomandorealizarlassiguientesacciones

Silabaseproductionnoexiste,rakecrearaunaversinvaca,basadaenla
estructuradelabasedevelopment.

Silabaseexiste,modificarsuestructura,aplicandolasmigraciones
pertinentes.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag163/197actualizadoal06/01/13

Instalar Mongrel como servicio


InstalaremosaMongrelcomoserviciodeWindows.Cuidadoalcopiar/pegar:
mongrel_rails service::install -N demo -c c:\InstantRails-2.0win\rails_apps\demo-production -p 4000 -e production
Mongrel service 'demo' installed as 'demo'.

Siexaminanconcuidadolalneaderdenes,Mongrelatenderestaaplicacinenel
puerto4000.OtrasaplicacionesquerealicemosconRailsdeberanllevarotronmerode
puerto.
Podemosiniciarelserviciodedosmaneras:

PorMSDOS
net start demo

MediantelaConsoladeAdministracindeWindows

DeberamosveraMongrelenproduccin,siapuntamoselnavegadora
http://127.0.0.1:4000

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag164/197actualizadoal06/01/13

Porcierto:enlaConsoladeAdministracindeberamosdejarcorriendotantolaaplicacin
demo,comoApache;cadavezqueinicielacomputadora.Reviselaspropiedadesde
ambosservicios,ycomoapareceenlasiguientecaptura,actveloscomo"Automtico".

Configurar Apache
Hastaaqutenemoslaaplicacin
listaparaserviralosusuarios.Sin
embargo,habamosmencionado
queporrazonesdecargay
estabilidad,esconvenienteponer
adelantedeMongrelalviejo,
grunyconfiableApache.Bajo
InstantRailselprocedimientoes
muysencillo:
Debemosabrirc:\InstantRails2.0
win\conf_files\httpd.confy
agregaralfinallassiguientes
lneas:

<VirtualHost *>
ServerName demo
ProxyPass / http://localhost:4000/
ProxyPassReverse / http://localhost:4000
</VirtualHost>

RestaqueApachequedecomoservicio(cuidadoconlaruta)
C:\InstantRails-2.0-win\apache>apache -k install
Installing the Apache service
The Apache service has been installed successfully.

Podemosprobarloentrandoahttp://127.0.0.1
nimo,faltapoco!

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag165/197actualizadoal06/01/13

Finalmente,anivellocal,deberamosagregaralarchivo
C:\WINDOWS\SYSTEM32\DRIVERS\ETC\HOSTS,unalneaparecidaaalasiguiente
127.0.0.1

localhost mandragora mandragora.bunker.org.ar demo

SideseamosquelasotrascomputadorasdelaLANveannuestraaplicacin,deberamos,o
bienconfigurarunCacheDNSlocal(23),oalterarelarchivohostsdecadamaquina,
agregando(nocambiando)lasiguientelnea.
192.168.1.33

demo

Siadivinan,estalineaapuntarreferenciasdeltipo"http://demo"hacialaipdela
computadoraqueseencuentrasirviendo.Enelejemplo:192.168.1.33

Errores
Siobtenemoserrores:

DebemosasegurarnosefectivamenteenlaConsoladeAdministracindeWindows
(InicioEjecutarservices.msc)quetantolaaplicacindemocomoApachese
encuentraniniciados.Sialteramosalgunodelosarchivosdeconfiguracin,
deberamosreiniciarpreventivamenteestosservicios.

23 LospasosparainstalarunCacheDNSbajoLinuxpuedeconsultarlosenelManualdeRedesLibres,del
mismoautor,enladireccinhttp://www.bunker.org.ar/incubadora/redes.pdf

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag166/197actualizadoal06/01/13

3) SiobtenemosunerrorGET,elproblemaocurrecuandoApacheinterrogaaMongrel,
elcualpodraestardetenido,ofuncionarmal.Podemosprobarcomoest
funcionandoelmodoproduccin,conbaseytodo.
ruby script\server --environment="production"

Sielpuerto3000yaseencuentraocupadopornuestrainstanciadedevelopment,

puedepasarascript\serverelparmetrop(otropuerto).Siobtenemosunerror
"desconocido",deberamosrevisarelarchivolog\production.logenbuscade
problemas.Estearchivo,sibienpuedeserabiertoporcualquiereditor,nodebemos
olvidarquetodoeltiempoesalteradoporMongrel,demodoquesideseamostener
unavista"entiemporeal"delaaplicacin,deberamosobtenerunequivalenteal
comandotailfdeLinux.ParaWindowspodemosrecurrira
http://tailforwin32.sourceforge.net
Recuerdequenotodosloserroressurgenanteelnavegador.Porrazonesdeseguridad,solo
sevuelcanalarchivodelogparaserrevisadosporeladministrador.
Encasoquedeseedesbloquearciertoserrores,leaconsejoreviseeldocumento
http://guides.rubyonrails.org/debugging_rails_applications.html

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag167/197actualizadoal06/01/13

Links recomendados:
http://mongrel.rubyforge.org
http://mongrel.rubyforge.org/wiki/Win32

Server de Produccin en Linux Ubuntu


Comoprimeramedida,instalamosApachemediantelautilidadaptget/aptitude.Sidesea
ayudarespectodelmanejodeestasherramientas,srvaseleerelcaptulo"Instalando
binariosdesdelasfuentes",presenteenelManualdeRedesLibres.Estelibro,delmismo
autor,seencuentradisponiblelibrementeenelsitio
http://www.bunker.org.ar/incubadora/redes.pdf
s@mandragora:~$
libaprutil1-dev

sudo apt-get

install apache2 apache2-prefork-dev libapr1-dev

(unmontnderesultados)
AcontinuacininstalamosPassenger,elcualnospedirquerealicemosmanualmente
algunospasos.Tambinnosrecordarlaimportanciadeaprenderlaformaenquerazona
Apache.
s@mandragora:~$ sudo gem install -r passenger
Building native extensions.

This could take a while...

Successfully installed passenger-2.2.9


1 gem installed
Installing ri documentation for passenger-2.2.9...
Installing RDoc documentation for passenger-2.2.9...
s@mandragora:~$ sudo passenger-install-apache2-module
Welcome to the Phusion Passenger Apache 2 module installer, v2.2.9.
This installer will guide you through the entire installation process. It
shouldn't take more than 3 minutes in total.
Here's what you can expect from the installation process:
1. The Apache 2 module will be installed for you.
2. You'll learn how to configure Apache.
3. You'll learn how to deploy a Ruby on Rails application.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag168/197actualizadoal06/01/13

Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.
Press Enter to continue, or Ctrl-C to abort.
-------------------------------------------Checking for required software...

Some required software is not installed.


But don't worry, this installer will tell you how to install them.
Checking for required software...
* GNU C++ compiler... found at /usr/bin/g++
* Ruby development headers... found
* OpenSSL support for Ruby... found
* RubyGems... found
* Rake... found at /usr/bin/rake
* rack... found
* Apache 2... found at /usr/sbin/apache2
* Apache 2 development headers... found at /usr/bin/apxs2
* fastthread... found
* Apache Portable Runtime (APR) development headers... found at /usr/bin/apr-1config
* Apache Portable Runtime Utility (APU) development headers... found at
/usr/bin/apu-1-config
-------------------------------------------Compiling and installing Apache 2 module...
-------------------------------------------The Apache 2 module was successfully installed.
Please edit your Apache configuration file, and add these lines:
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger2.2.9/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.9
PassengerRuby /usr/bin/ruby1.8
After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag169/197actualizadoal06/01/13

configuration!

Siprestamosatencin,veremosqueelscriptnosexplicaquedebemosquedebemos
agregaralgunaslineasenelarchivodeconfiguracindeApache.Talcomoserecomienda
enlaexcelenteobraAgileWebDevelopmentwithRails3ed,Captulo"InstallingPassenger",
buscamoselarchivodeconfiguracindeApache.Estearchivopuedediferirsegnla
versindeLinux,UnixoWindowsqueestemosusando.
s@mandragora:~$ apache2ctl -V | grep SERVER_CONFIG_FILE
-D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"

EnelcasodeUbuntuyDebian,elarchivoamodificares/etc/apache2/apache2.conf

Perosigamosleyendoquemasnosdiceelscriptdeinstalacin.

VirtualHosts
Elscriptdeinstalacinnoquierodejardecomentarlaimportanciadeconfigurarlos
VirtualHosts(24).
Paracomenzar,enelarchivo/etc/apache2/apache2.conf,buscamoslassiguienteslneas,y
lasdejamosdelasiguientemanera:
NameVirtualHost *:80
Include /etc/apache2/sites-enabled/

Aquestamosindicando,enprimerlugar,queesteservidornoatiendeunasolaaplicacin,
sinovarias.Comosegundamedida,habilitamoselnewstylequetienelosadministradores
Linux(noWindows,noUnix)derepartirlaconfiguracindecadaaplicacinenunarchivo
distinto.Estoestilparanosobrecargarnimezclartemsenelarchivohttpd.conf,oel
apache2.conf
Luego,usandoelsudopower,creamosunarchivodemo,enlaruta/etc/apache2/sites
available,cuyocontenidoserequivalentea
24 Laexpresin"VirtualHost"hacereferenciaalacapacidaddeApache,deservirvarioshosts,talescomo
http://pachanga.com,http://vivalapepa.org.ar,http://demo,etc,sobreunamismamaquina,esdecir,
sobreunmismohost.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag170/197actualizadoal06/01/13

<VirtualHost *:80>
ServerName demo
#Estamos trabajando en entorno de produccin, pero si deseamos otro entorno:
#RailsEnv development
DocumentRoot /home/s/demo/public

# <- Atencin al public final

<Directory /home/s/demo/public>

# <- Atencin al public final

AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>

Estenewstyledeconfigurarunarchivoporcadaaplicacin,seraimposibledereproducir
enWindows,debidoaNTFScarecedelacapacidaddeconstruirlinkssimblicos.Estos
elementosseparecenalosaccesosdirectos,conladiferenciaqueloslinkssimblicos
puedenserseguidosporprogramas.Apachepuedeseguirunlinkhastasuubicacinfinal,
comosiestefueraelarchivooriginal.
Paraserexacto,nuestroarchivodemo,queseencuentraen/etc/apache2/sitesavailable,
deberaservinculadohaciaunacarpetaubicadaen/etc/apache2/sitesenabled
Sibienpodemoshacerestepasoenformamanual,esdecir
ln -s /etc/apache2/sites-available/demo /etc/apache2/sites-enabled/demo

Podemosutilizarencambio,uncomandodeApache2,muchomasseguro:
s@mandragora:/etc/apache2$ sudo a2ensite demo
Site demo installed; run /etc/init.d/apache2 reload to enable.
s@mandragora:/etc/apache2$ sudo /etc/init.d/apache2 reload
Reloading web server config apache2
Algunos mensajes... controlar solamente el [OK]

Porcuriosidad,sicorremoselsiguientecomando
s@mandragora:/etc/apache2$ ls -l /etc/apache2/sites-enabled/
lrwxrwxrwx 1 root root 33 2010-02-11 22:18 demo -> /etc/apache2/sitesavailable/demo

Podremosverqueelarchivo/etc/apache2/sitesavailable/demoposeeunaccesodirecto
queloapuntadesde/etc/apache2/sitesenabled/

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag171/197actualizadoal06/01/13

Siahoraprobamoscargarenelnavegadorlasdirecciones
http://127.0.1.1/ohttp://127.0.0.1/
Deberamosverlaaplicacincorriendo.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag172/197actualizadoal06/01/13

Multihosting
SupongamosquetenemosotraaplicacinRailsenelmismoservidor.Lallamaremos
Pasantes(esunodemisproyectos,paraadministrarpasantas).Lacrearemos,naturalmente,
medianteelcomando
s@mandragora:~$railspasantes

Aligualquecondemo,generamosunarchivopasantesen/etc/apache2/sitesavailable
Sucontenidoesunacopiamuyparecidaalarchivodemo,presenteenlamismacarpeta.
<VirtualHost *:80>
ServerName pasantes
#Estamos trabajando en entorno de produccin, pero si deseamos otro entorno:
#RailsEnv development
DocumentRoot /home/s/pasantes/public
<Directory /home/s/pasantes/public>
AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>

Lohabilitamoscon
s@mandragora:$ sudo a2ensite pasantes
Site pasantes installed; run /etc/init.d/apache2 reload to enable.
s@mandragora:$ sudo /etc/init.d/apache2 reload

Yestaparteesnueva:enelarchivo/etc/hostsnosaseguramosquelapilaTCP,
concretamenteaquellaqueresuelvenombres,hagaa127.0.0.1lassolicitudesdenuestras
aplicaciones:
127.0.0.1 localhost demo pasantes
127.0.1.1 mandragora demo pasantes

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag173/197actualizadoal06/01/13

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag174/197actualizadoal06/01/13

Alojar el proyecto sobre un Cloud


Uncloudesunracimodeservidoresalojadoenalgunapartedeinternet.Facebook,Gmail,
Twitterymuchasotrasaplicacionesresidenencloudso"nubes".
Cuandonoqueremoscomplicarnosconlosdetallesdeinstalacin,onoqueremosinstalar
unserverenlaempresasoloparacorrerconRails,ynonosimportagastarunosdolares,
podemoshacerusodelosmuchoscloudsdisponibleseninternet.

GitHub o Heroku?
Anoconfundir:anivelgratuito

HerokuofrecehostingyalgunosrudimentosdeGIT.

GITHUBnoincluyehosting,peroacambioofrecemuchasopcionesparagestionarun
proyectocolaborativo,ysinlimitesdetamao.

EnrealidadlarespuestaesGitHubyHeroku:GITescapazderegarcdigoenambos
serviciosmedianteelcomandopush.
Paraelsiguienteejemplo,haremosusodelserviciogratuitodeHeroku.Encasoque
necesitemosmas"traccindehosting",siemprepodremoscontratarallserviciosextras
comoDynosoWorkers.Sinecesitamosmaspotenciadegestindeproyecto,
paralelamentepodemosusargithub,configurndolocomofiguraen
http://teachmetocode.com/screencasts/gettingstartedwithgithub

Alojar y Compartir en Heroku


Lospasosparaalojar,ycompartirunproyectoenHeroku,sonlossiguientes.
s@mandragora:~/demo$ sudo gem1.8 update
s@mandragora:~/demo$ sudo gem1.8 update --system
Updating RubyGems
Nothing to update
s@mandragora:~/demo$ sudo gem1.8 install heroku -V
s@mandragora:~/demo$ sudo gem1.8 install taps -V

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag175/197actualizadoal06/01/13

Generamosunconjuntodellaves(yenWindows?):
s@mandragora:~/demo$ ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ''
s@mandragora:~/demo$ ssh-keygen -t dsa -f ~/.ssh/id_rsa -N ''
s@mandragora:~/demo$ heroku keys:add
Found the following SSH public keys:
1) id_dsa.pub
2) id_rsa.pub
Which would you like to use with your Heroku account? 1
Uploading SSH public key /home/s/.ssh/id_dsa.pub

CreamosunproyectodentrodeHeroku
s@mandragora:~/demo$ heroku create demo
Enter your Heroku credentials.
Email: "escuelaint@gmail.com"
Password:
Uploading ssh public key /home/s/.ssh/id_rsa.pub
Creating demo.... done
Created http://demo.heroku.com/ | git@heroku.com:demo.git

Sinolohemoshecho,pedimosagitqueseinstalesurboldecambios
s@alcaudon:~/Escritorio/Proyectos/demo$ git init .

Sinolohemoshecho,configuramosusuarioycorreo
s@mandragora:~/demo$ git remote add heroku git@heroku.com:demo.git

Enrealidad,laordengitremoteaddagregapornosotrosensuarchivo.git/configuna
seccinquereza:
[remote "heroku"]
url = git@heroku.com:demo.git
fetch = +refs/heads/*:refs/remotes/heroku/*

Configuramosalgunosvaloresmas
s@mandragora:~/demo$ git config --global user.name "Sergio Alonso"
s@mandragora:~/demo$ git config --global user.email "escuelaint@gmail.com"
s@mandragora:~/demo$ git config --global color.ui "auto"

Antesdehacerelpushhaciaheroku,nosaseguramosdehaberentregadolocalmente

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag176/197actualizadoal06/01/13

todosloscambios
git add .
git commit -a

Ahorasi,subimoslaaplicacin.
s@mandragora:~/demo$ git push heroku master

Tcnicamente,todoestalistoparaencontrarnuestraaplicacincorriendoen
http://(nuestraaplicacin).heroku.com

Sinembargo,estodispararunerrorenlaversinonline,puestoquefaltasubirlabase.Ya
habamencionadoquelosproyectosrails3normalmentetraenunarchivoenlaraz
llamado.gitignore,quesirveparaquedurantelospushnosesubanciertosarchivosy
carpetas.Simiramosnuestroarchivo.gitignore,encontraremosquenuestrabasededatos...
probablementenohasubido:
.bundle
db/*.sqlite3
log/*.log
tmp/**/*

Lamaneraobviadepermitirsubiralabasedevelopment.sqlite3aproduccinseraquitar
db/*.sqlite3de.gitignore,perosiunosedetieneapensarlo,locoherenteseracorrerlas
migracionessobrepostgresql,aligualqueheroku,elcualsindudadebeestarmuy
optimizado,puestoquesirvedecenasdemilesdeaplicacionesporsegundo.Igual,nohay
quepreocuparseconesto,porqueactiverecordnosdaindependenciarespectodela
basequeseusaenproduccin(podriahabersidomongodbuotracosa).
Lalneadb/*.sqlite3existepordefectoporsiutilizamossqlitetambinenelserverde
produccin,ynoqueremossobrescribirconverduralosdatosqueendefinitiva,nosestn
dandodecomer.
Siestamossegurosdenosobrescribirdatosimportantes,ytenemoslagemataps,podemos
quitaresalnea,yempujarlabaseentera,conmigracionesytodo:
s@mandragora:~/demo$ heroku db:push

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag177/197actualizadoal06/01/13

Ahorasi,aprobarlaaplicacin.Recuerdeejecutarherokulogsencasodeerroresdurante
eldeploy.

Retomar o Colaborar con un proyecto alojado en Heroku


SideseamostantocolaborarconunproyectoalojadoenHerokucomocontinuarconuno
propionuestro,desdeotroequipo,deberamoscomenzarcreandounjuegodellaves,
instalarlagemaheroku,enviarlasllaves,yrealizarunclonedelproyecto.Enpocas
palabras:
s@mandragora:~$ ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ''
s@mandragora:~$ ssh-keygen -t dsa -f ~/.ssh/id_rsa -N ''
s@mandragora:~$ sudo gem1.8 install heroku
s@mandragora:~$ heroku keys:add

Noolvidarsituarseenalgunacarpetadondealojemosnuestrosproyectos,y...
s@mandragora:~$ git clone git@heroku.com:demo.git

Entramosalproyecto,ponemosalgoquenoestabaantes...
s@mandragora:~$ cd demo
s@mandragora:~/demo$ touch archivo_nuevo

TouchnoexisteenWindows:solofabriqueunarchivoenblanco.
Ponemosaldaelrepositoriolocal,explicamoslanovedad...
s@mandragora:~/demo$ git add .
s@mandragora:~/demo$ git commit -a -m "un archivo nuevo"

Sitenemosmasdeunrepositoriodonderealizarnuestraentregas,comoheroku,yalavez
github,aveces,antesderealizarelpushpordefecto(origintomaster)convienerevisarlas
entradasexistentesen.git/config.
Puedeserquehayamosalteradolaestructuradelastablas,agregadooborradocosas.En
talcaso,sincronizamos
s@mandragora:~/demo$ heroku rake db:migrate

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag178/197actualizadoal06/01/13

Ysubimosnuestroscambiosalrepositorioconfiguradopordefecto.
s@mandragora:~/demo$ git push origin master

O,sitenemosmasdeunrepositorioconfiguradoen.git/config,comogithub,especificamos
herokucomodestino
s@mandragora:~/demo$ git push heroku master

Siademsqueremosbajarlabaseconlosdatosenproduccin,sobreescribiendola
nuestraendevelopment,parabackupear,desarrollarotestearcondatosreales(loquese
conocecomohacerelrestoredelabase),podemoshacerun
s@mandragora:~/demo$ heroku db:pull
Receiving schema
Receiving data
n tables, m records
users:
00:00:00

100% |==============================================| Time:

pages:
00:00:00

100% |==============================================| Time:

comments:
00:00:00

100% |==============================================| Time:

tags:
00:00:00

100% |==============================================| Time:

Receiving indexes
Resetting sequences

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag179/197actualizadoal06/01/13

ApndiceA
Ayuda!
NoquieroexplicarlecomobuscarinformacinenInternet.Peroesposiblequehayaestado
buscandoenelsitioerrneo.Veamosalgunastcnicasparaencontrarrpidamenteel
error.Paraempezar,debemostenerclaroelerror:

Debuggear en Ruby
Cuandounprogramanohaceloquedebe,siempretenemoslaopcindeinspeccionarlo.
Losprogramasescritosenruby(archivos.rb)seinspeccionanmedianteelcomandordebug.
Esdecir,unprogramaRubypuro,porejemplo,paraterminal,ellugardeserlanzadocon
rubyprograma.rb,selolanzaconrdebugprograma.rb
ParaunproyectotpicodeRuby,estagemaseinstalacon
sudo gem1.8 install ruby-debug
gem install ruby-debug

Eldebuggersecontrolamediantepalabrascomolist,continue,next,yotrasqueveremos
enelsiguientecapitulo.

Debuggear en Rails
EnelcasodeRailsdebemoscumpliralgunospasosextrasparatodoconecteardebug.
ComenzamosagregandoalarchivoGemfileunalnea:
gem 'ruby-debug'

Yluegocorremos
sudo bundle install

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag180/197actualizadoal06/01/13

Ahoracorremoselserverdepruebasconunaadidoalfinal:
rails server --debugger

Para debuggear en la vista


Enpocaspalabras:insertamosdondenosgusteunalnearevisandolavariable
<%= debug(@unvalor) %>

Para debuggear en el controlador


Insertamoslapalabradebuggerdondedeseamosinspeccionar.Ejemplo:
def check
@bugs = Bug.all
@bugs.each do |bug|
params[:cb_].each do |parametro|
if bug.id == parametro.id
debugger
bug.accepted = true
bug.save
end
end
end
end

Lalineadebuggerpausalaejecucin.Sivamosalasalidadelrailsserver,descubriremos
quelaejecucinsehadetenido,yquenosesperaunpromptparaintroducircomandos.
Elcomandohelpnosproveerayuda:
(rdb:2) help
ruby-debug help v0.10.3
Type 'help <command-name>' for help on a specific command
Available commands:
backtrace

delete

enable

help

next

quit

show

undisplay

break

disable

eval

info

reload

source

up

catch

display

exit

irb

pp

restart

step

var

condition

down

finish

list

ps

save

thread

where

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag181/197actualizadoal06/01/13

continue

edit

frame

method

putl

set

trace

Porejemplo,listnosmostrarlaseccinqueestamosrevisando:
(rdb:41) list
[3, 12] in
/home/s/Escritorio/Proyectos/r3uw/app/controllers/checklist_controller.rb
3
4

@bichos = Bug.all
end

5
6
7
=> 8
9
10
11

def check
debugger
@bugs = Bug.all
@bugs.each do |bug|
params[:cb_].each do |parametro|
if bug.id == parametro.id

12

bug.accepted = true

Nolohagatodava,perolaordencontinueseguirlaejecucinhastaelfinal(ohastaque
encuentreunapalabrabreakpoint;)
(rdb:2) continue

Podemostambinavanzardeapocousandosteponext.Ladiferenciaentreunoyotro
estribaenquesibiennextcontinuaralalnea9delejemplo,silovolvemosaejecutarall,
luegosaltarlaexplicacindelbucle(nextnosemeteralbucle).Encambiostepentrar
ala9.Perosivolvemosaejecutarloall,enlugardepasarala10,descenderalniveldelas
librerasdeRailsparamostrarnosloqueocurredentrode.each!,locualrequierede
mayoresconocimientos.
Enpocaspalabras:utilicenextparaavanzar,ystepparadescenderniveles.

Otraordenimportanteesinstance_variables,lacuallistatodaslasvariablesenejecucin.
(rdb:195) instance_variables
["@_params", "@_config", "@lookup_context", "@_action_name", "@_status",
"@view_context_class", "@_response", "@_headers", "@action_has_layout",
"@_response_body", "@_env", "@_request", "@bugs"]

Siporejemplo,queremosinvestigarlavariable@_params,podemosrevisarlaaligualqueen
rdebugconlaordendisplay@params,oenelcasodeRails,simplementelomencionamos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag182/197actualizadoal06/01/13

eneldebugger:
(rdb:195) @_params
{"cb_"=>{"6"=>"6", "7"=>"7", "13"=>"13", "27"=>"27", "28"=>"28", "2"=>"2",
"18"=>"18", "3"=>"3", "4"=>"4", "21"=>"21", "5"=>"5"}, "commit"=>"Submit
Selected", "authenticity_token"=>"n0wBjYDJqzEr1vi3ECVhNkqFnU1LqEd9g4TQK4Y5psg=",
"utf8"=>"\342\234\223", "action"=>"check", "controller"=>"checklist"}

Recuerdequesicambiaelcdigofuenteduranteunasesindeldebugger,nosiempre
podrcontinuar(continue)hastaelfinalyvolveralanzarelcdigo(F5enelnavegador).
Seguirnfigurandolosmismoserroresapesardehabersidocorregidos.DeberhacerCtrl+
Cenlasalidadelserver,yrecomenzarunasesinfresca.Esdecir,debehacerlomismoque
siestuvieraconcualquierlenguaje.
Finalmente,algomagnficodeestedebuggeresquepodemosllamarairbencualquier
momentoparajugarconlasvariablesquevamosrevisando.
Enhttp://guides.rubyonrails.org/debugging_rails_applications.htmlpodemosencontrar
explicadosestoscomandos.

Listas de Correo
Laslistasdecorreosonlaprincipalfuentederesolucindeproblemas.Anmese,yantese:
sesorprenderdeencontrarunacomunidadmuyamable,compuestaconexpertosquese
sientenagustoplanteandoproblemasysoluciones.
ListaEspaola:http://lists.simplelogica.net/mailman/listinfo/rores
ListaArgentina:http://lista.rubyargentina.com.ar/listinfo.cgi/rubyrubyargentina.com.ar

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag183/197actualizadoal06/01/13

Paraleerloscorreosquellegan,lerecomiendoqueutiliceunclientecomoThunderbird,
Kmail,SylpheedyEvolution.stosprogramaspermitenmanejarlasconversaciones

mediantethreads(hilos).LosfiltrosdeGmailtambinsonmuybuenosanidando
conversaciones.
Imagenobtenidademiotrolibro,RedesLibres,ApndiceA"Ayuda",unaversinextendidadeesteApndice.
Puededescargarlodesdewww.bunker.org.ar/incubadora/redes.pdf

Twitter
LacomunidaddeSoftwareLibre,yparticularmenteladeRuby,seencuentranconectadas
casiexclusivamentemedianteestaredsocial.Aquhaynoticiasdeprimeramano,del
mismofrentedecombateenRuby,ydelosmismoscreadoresdeRailsysusgemas.
SiesusuariodeTwitter,sabrqueelsecretoconsisteenseguir("Follow")solamentegente
interesante.Comoejemplo,lerecomiendosigaamiscontactos:sustweetssonverdaderos
mazazosdeinformacintil:

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag184/197actualizadoal06/01/13

AutoressobreTutoriales:

https://twitter.com/railstutorialMichaelHartl,elcreadordeunlibromejorqueeste.

https://twitter.com/RubyLearningSatishTalim,Guru

https://twitter.com/samrubyOtrogranescritor

https://twitter.com/raymichaRaymiSaldomando,laexpertaenmaquetado

Noticiasfrescas:

https://twitter.com/rails

https://twitter.com/rubyflow

https://twitter.com/RubyInside

https://twitter.com/ruby_news

https://twitter.com/rails_bookmarks

Programadoresyminerosdegemasquehayqueseguir:

https://twitter.com/dhhDavidHeinemeierHansson,ElcreadordeRuby

https://twitter.com/soveran:MichelMartens

https://twitter.com/AkitaOnRails:FabioAkita

https://twitter.com/luislavena:LuisLavena

https://twitter.com/drnicElincrebleDrNic

https://twitter.com/karanchoYo:)

Cheatsheets y RI
Habamosyamencionadoario"RubyInformation",uncomandocapazdeobtenerdesde
consola,ayudasobreloscomandosylibrerasdeRuby.
Porotrolado,estnlascheatsheetso"tarjetasdereferenciarpida":resmenesrpidosy
concisos,listosparaserpegadosauncostadodelmonitor.Increblemente,hayunagema

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag185/197actualizadoal06/01/13

enRubydondesecentralizantodaslasayudasgeneradasporlacomunidad.
PodemosencontrarvariasenformatoPDF,enlasdirecciones

http://cheat.errtheblog.com

https://www.dropbox.com/gallery/4822841/1/Rails%203%20Cheat%20Sheets?h=d08610#/

Perosiempresermascoolsolicitarlasvalneadecomandos:
sudo gem1.8 install cheat
gem install cheat

Paraverloscomandosdisponibles
cheat cheat

Paraverunalistadelascheatsheetsdisponibles
cheat sheets

Ejemplodecheatsheetsquevalenlapenamirar
cheat rails_console

cheat unix

cheat vim

cheat cucumber

cheat has_many

cheat wife

cheat rails

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag186/197actualizadoal06/01/13

ApndiceB
Links Recomendados & Imperdibles
EnIngles

Libros

Gratis:

www.railstutorial.org

Pagos

AgileWebDevelopmentwithRails,CuartaEdicinprcticamentelabibliade
Rails

Revistas,gratis:

http://railsmagazine.com

ScreenCastingsyvideosgratis

www.railscasts.com

http://globalplaza.org/spaces/conferenciarails/videos

http://teachmetocode.com/screencasts

Tutorialesasistidos

Gratis

http://tryruby.orgPequeoTutorialonlinesobreRuby

http://railsforzombies.orgTutorialonlinesobreRuby,muysimptico.Tieneotras
seccionespagas,peroquevalenlapena.

ConsulteotrosquevoydejandosincronizadosconmiFirefox,en
http://del.icio.us/karancho/ruby+tutoriales

Pagos

www.railstutorial.org(videospagos).

EnEspaol

Libros

Gratis

Lapresenteobra,yAFAIK(25),ningnotro.

Pagos

25 AsFarIKnowHastadondepudesaber.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag187/197actualizadoal06/01/13

Lapresenteobra,versinenpapel,idealparalacarteradeladama,yel
bolsillodelcaballero.

Casting,Videos:

http://es.asciicasts.com

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag188/197actualizadoal06/01/13

Polgono de tiro para captulos nuevos


Codemonkeystrabajando:

Entrarconcasco

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag189/197actualizadoal06/01/13

Sistema de login en rama testing de GIT


EjemploempleandoDevise.Paraalgomasartesanal,hayunportdeAuthLogicparaRails3
presenteenhttps://github.com/csanz/authlogicrails3port
Bibliografa:
1. http://github.com/plataformatec/devise/
2. RyanBates'Railscast:http://railscasts.com/episodes/250authenticationfromscratch
3. http://railscasts.com/episodes/209introducingdevise(ysuversionasciicasts)
4. http://railscasts.com/episodes/210customizingdevise(ysuversionasciicasts)
Instalarsegn1,nosegn2,ynosolamentemediantebundle,quenomerevisuna
dependenciaimportante.

DefinirenGemfilelaentrada

gem 'devise'

AgregardevisealGemfile,lanzarbundle

bundle install

Instalarelnuevogenerador

rails generate devise:install

Talcomoserecomiendaporelenvodecorreo,agregara
config/environments/development.rblalinea

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

(ycorregirlacuandosubaaproduccinenunserverconcapacidaddeenvodecorreo).
Quedaindicaralgunarutapordefectoenconfig/routes.rbojoelplural.Yoescogi
(ADAPTAR)
root :to => "bugs#index"

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag190/197actualizadoal06/01/13

Salirdeconfig/routes.rb,porqueenseguidaelgeneradordevisevaatocarlo.
rails generate devise User
invoke

active_record

create

app/models/user.rb

invoke

test_unit

create

test/unit/user_test.rb

create

test/fixtures/users.yml

inject

app/models/user.rb

create

db/migrate/20100412200407_devise_create_users.rb

route

devise_for :users

Cuandoelgeneradordevisegenera(valgalaredundancia)unmodeloquesirvaparaque
losdemsseautentiquenconl,ledalaformaquesepuedeapreciaren:
app/models/user.rb
db/migrate/20100412200407_devise_create_users.rb

aunqueenlanuevaversindelagemanohacefaltacambiarnada,convieneleerpara
quesirvenlositemsdeadentroyadaptarsihicierafalta.Lagemaseencuentramuybien
documentadaenhttp://github.com/plataformatec/devise/.
rake db:migrate

Convienerevisarlasrutasconrakeroutes,yaalprincipioaparecenciertasurlmuytiles:
new_user_se GET
ssion

/users/sign_in

{:controller=>"devise/sessions", :
action=>"new"}

user_sessio POST
n

/users/sign_in

{:controller=>"devise/sessions", :
action=>"create"}

destroy_use GET
r_session

/users/sign_out

{:controller=>"devise/sessions", :
action=>"destroy"}

/users/password(.:format)

{:controller=>"devise/passwords",
:action=>"create"}

user_passwo PUT
rd

/users/password(.:format)

{:controller=>"devise/passwords",
:action=>"update"}

new_user_pa GET
ssword

/
{:controller=>"devise/passwords",
users/password/new(.:forma :action=>"new"}
t)

POST

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag191/197actualizadoal06/01/13

edit_user_p GET
assword

/
{:controller=>"devise/passwords",
users/password/edit(.:form :action=>"edit"}
at)

POST

/users(.:format)

{:controller=>"devise/registration
s", :action=>"create"}

PUT

/users(.:format)

{:controller=>"devise/registration
s", :action=>"update"}

user_regist DELE
ration
TE

/users(.:format)

new_user_re GET
gistration

/users/sign_up(.:format)

{:controller=>"devise/registration
s", :action=>"new"}

edit_user_r GET
egistration

/users/edit(.:format)

{:controller=>"devise/registration
s", :action=>"edit"}

{:controller=>"devise/registration
s", :action=>"destroy"}

Estosdatosqueaprimeravistanotienensentido,sonmuytilescuandoexaminamosla
trazadelrailsserver(odellogequivalenteenlacarpetalog/).
Porejemplo,cuandovemospasarun
Started GET "/users/sign_out" for 192.168.1.10 at Sun Sep 05 02:16:56 -0300 2010
Processing by Devise::SessionsController#destroy as HTML
User Load (1.1ms)

SELECT "users".* FROM "users" WHERE ("users"."id" = 1)

Significaquequeelusuarioconid=1harealizadounsign_out,yporlotantosehadestruido
susesin:
destroy_user

GET

/users/sign_out

_session

{:controller=>"devise/sessions",
:action=>"destroy"}

RailshaceusodeinstruccionesREST,yaprovechaciertosvaloresquepuedenmandarlos
navegadoreshaciaunservidorweb.AdemasdeGETyPOST,algunosframeworkscomo
Rails,SinatrayPadrino,proponenrescatardossealesmasquesedejarondeusarhace
muchosaos:PUTyDELETE.
Enestepunto,enhttp://railscasts.com/episodes/209introducingdeviseproponenagregar
allayoutexistenteenapp/views/layouts/application.html.erb,unapequeazonaque
informeelestadodelasesindeusuario:
<div id="user_nav">
<% if user_signed_in? %>
Signed in as <%= current_user.email %>. Not you?

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag192/197actualizadoal06/01/13

<%= link_to "Sign out", destroy_user_session_path %>


<% else %>
<%= link_to "Sign up", new_user_registration_path %> or
<%= link_to "Sign in", new_user_session_path %>
<% end %>
</div>

Loquesetraduceenquesielusuarionoestlogueado,leaparecernlasopciones
Signup(inscribirse)/SignIn(conectarse)
Siyaseencuentralogueado,mostrarsolamentelaopcinparahacerSignout(salir).

Tu Ruta es mi Ruta (link_to & rake routes)


Porcierto,habrnotadoqueenRailssetieneporcostumbreutilizarlink_toenforma
recurrente,enlugardelclsicoenlace<a>.Ejemploderecin:
<%= link_to "Sign in", new_user_session_path %>

Esteestilodemanejarlosenlaceshasidoconcebidoparanotenerquereescribirlos
vnculosdelosmodosdevelopment,cuyaurlcontendr:3000/etc,ydelmodoproduction,
quecontendreldominioverdaderowww.suempresa.com/etc.
Sinembargo,subsistelaextraamaneradereferirsealcontrolador/accin.
Enelejemplo...dedndesalenew_user_session_path?Enprincipio,delroutes.rb,pero,
adondeva?.Lamejormaneradesaberloesmirandotodaslasrutasdisponiblesmediante
elcomandoderecin,rakeroutes.Copionuevamentelaprimerlnea,yremarcoencolor
azulloqueusteddeberacopiar:

new_user_session

GET

/users/sign_in

{:controller=>"devise/sessions", :
action=>"new"}

Quedacomo
<%= link_to "Sign in", new_user_session_path %>

Su identificacin, por favor


Quedaasegurarenloscontroladores,lgicamenteelaccesoalasacciones.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag193/197actualizadoal06/01/13

Paraellobastainstalaralprincipiodelcontrolador,unaordenequivalentea:
before_filter :authenticate_user!, :except => [:show, :index]

Habilitamoslacreacindevistaspersonalizadas
rails generate devise:views

Ygeneramosvariasvistaspersonalizadasparalosusuarios
rails generate devise:views users

Siyahemoscreadonuestrousuario,yquisiramosinhibirlacreacindeusuariosnuevos,
tenemosvariasmaneras:
Laformaobviaesquitardeapp/views/layouts/application.html.erblalinea
<%= link_to "Sign up", new_user_registration_path %> or

Otramanera,yqueporseguridadtambinpuedeactivarse,esbuscar
app/views/devise/registrations/new.html.erbycomentarlalinea
<p><%= f.submit "Sign up" %></p>

Demodoquequedealgoascomo
<p><%#= f.submit "Sign up" %></p>
Creacin de nuevos usuarios: <blink>deshabilitado</blink>

Unatercermaneraescrearnuestrospropioscontroladores,ocomenzaramanejarroles,
comosedetallaenhttp://github.com/plataformatec/devise
Queda:

Fusionarconappdelprincipio,demo.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag194/197actualizadoal06/01/13

Internacionalizacin (i18n)
Machete:
Segnguaoficial:http://guides.rubyonrails.org/i18n.html
Modificarlineaconfig.i18n.default_locale=:dedeconfig/application.rb
Agregaraapp/controllers/application_controller.rb
before_filter:set_locale

defset_locale
#ifparams[:locale]isnilthenI18n.default_localewillbeused
I18n.locale=params[:locale]
end
Creares.ymlenconfig/localesalestilodeen.yml,yponerlastraducciones.Idealmente:
merguearconalgunaslocalizacionesmuycompletaspresentes
https://github.com/svenfuchs/railsi18n/tree/master/rails/locale,alafechalamascompleta
eslamexicana(esMX).
hello_world: Hola Mundo
hello_flash: Hola Flash
Usar el helper t, ejemplos
Si en el controlador tenamos:
flash[:notice] = "Hello flash!"
Ahora podemos tener
flash[:notice] = t(:hello_flash)
Si en la vista tenamos
<h1>Hello world!</h1>
<p><%= flash[:notice] %></p>
Ahora podemos tener
<h1><%=t :hello_world %></h1>
<p><%= flash[:notice] %></p>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag195/197actualizadoal06/01/13

Para mayor comodidad, tambin se puede llamar al helper t dentro de los


f.label Por ejemplo, si en config/locales/es.yml hemos definido un hash:
:locality_id
Entonces podemos intercalar el helper t al label
<%=f.label:locality_id%><br/>
Detalmodoquequedeas:
<%=f.labelt:locality_id%><br/>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag196/197actualizadoal06/01/13

Autobombo:maslibrosgratis

Silegustestaobra,quizsdisfrutetambindeesteotrolibrogratuito.
EsuntratadosobreformasdeintegrarLinuxenambientesWindows,convirtindoloenuna
suertedemuletaparalosdemsservidores;unanavajasuizacapazdealigerarlacarga
queposeemoscadadalosadministradoresdesistemas.
EscribestelibrocomounosapuntesparamisalumnosdeAnlisisenSistemas,ycomoun
machete(ayudadememoria,enArgentina)deaquellospasosqueensumomentome
costdevariosdasdeexperimentacin.Allhevolcadomisexperienciasconfigurando
Apache,BIND,PHP,SquidProxy,NAT,FTP,SSH,Samba,administrandousuarios,yvelandopor
laseguridadyestabilidaddelared.
Creame:sepuededisfrutardeltrabajodeSysadmin:elpinginitoTuxeslallave.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag197/197actualizadoal06/01/13

Puededescargarlodesdehttp://www.bunker.org.ar/incubadoraredes.pdf

You might also like