Sie sind auf Seite 1von 197

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.

96Betapag1/197actualizadoal06/01/13

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

Udpodraestarleyendounacopiavieja!

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

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

[ Portada: Lic. Vernica V. Martnez [ Copyleft 2012 Sergio A. Alonso [ Twitter: @karancho [ http://ar.linkedin.com/in/alonsosergio [ Blog: http://obelix.bunker.org.ar [ http://about.me/elbunker

] ] ] ] ] ]

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

[ Hi, I am the root here. If you see me laughing, ] [ you'd better have a backup ready. ]

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag3/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)....................................................................................................................... 40

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

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

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

Integrar GIT al proyecto....................................................................................................................................71 Instalacin de GIT........................................................................................................................................71 Utilizar GIT en forma local .........................................................................................................................72 Agregando y cambiando archivos................................................................................................................ 75 La bitcora del maquinista II........................................................................................................................78 Trabajar con ramas y nmeros de versin.................................................................................................... 80 Borrando / modificando cosas antes del commit ("entrega")...................................................................... 82 Borrando / modificando cosas despus del commit.....................................................................................84 Revert, Reset, Checkout............................................................................................................................... 89 Resumen de este captulo..................................................................................................................................90 Captulo 5: Hola Mundo en Rails.......................................................................................................................... 91 Controladores y Acciones................................................................................................................................. 92 Reapuntando la pgina principal...................................................................................................................... 96 Captulo 6: ActiveRecord...................................................................................................................................... 99 Ejemplo de creacin de modelo, y alteracin de las convenciones.................................................................101 Comprobar todo.............................................................................................................................................. 103 Resumen..........................................................................................................................................................104 Desarrollar, Testear, Producir..........................................................................................................................105 Captulo 7: A levantar los andamios: Scaffolds................................................................................................... 107 Caminar hasta la locomotora...........................................................................................................................110 La bitcora del maquinista.............................................................................................................................. 111 Captulo 8: Validaciones...................................................................................................................................... 113 Captulo 9: La imagen no es nada: Layouts y CSS.............................................................................................. 114 Actividades......................................................................................................................................................115 Captulo 10: Uno para Todos................................................................................................................................117 Tablas Combinadas..........................................................................................................................................118 Formalizar la relacin..................................................................................................................................... 120 Integridad Referencial..................................................................................................................................... 121 Jugar con Tablas Combinadas en Rails Console ............................................................................................123 Querido diario................................................................................................................................................. 124 Partials............................................................................................................................................................ 126 Partials "a mano"........................................................................................................................................126 Ahhh rompi algo!...................................................................................................................................... 127 Me olvid de agregar unos campos! scaffold_controller..........................................................................128

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

El problema................................................................................................................................................ 128 Uno a muchos => Combo SELECT, Radio Buttons....................................................................................... 130 ORM... de nuevo............................................................................................................................................. 132 Tengo muchas tablas, ndices y campos!....................................................................................................... 133 Estrategia 1.................................................................................................................................................133 Estrategia 2.................................................................................................................................................135 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...................................................................................................................................142 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...........................................................................................................................................158 Server de Produccin en Windows..................................................................................................................161 Preparar Base..............................................................................................................................................161 Instalar Mongrel como servicio................................................................................................................. 162 Configurar Apache..................................................................................................................................... 163 Errores........................................................................................................................................................ 164 Links recomendados: .................................................................................................................................166 Server de Produccin en Linux Ubuntu.......................................................................................................... 166 VirtualHosts............................................................................................................................................... 168 Multihosting................................................................................................................................................171 Alojar el proyecto sobre un Cloud....................................................................................................................... 173 GitHub o Heroku?......................................................................................................................................... 173 Alojar y Compartir en Heroku........................................................................................................................ 173 Retomar o Colaborar con un proyecto alojado en Heroku.............................................................................. 176

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag7/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)................................................................................................191 Su identificacin, por favor........................................................................................................................ 192 Internacionalizacin (i18n)............................................................................................................................. 194

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag8/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.96Betapag9/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.96Betapag10/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.96Betapag11/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.96Betapag12/197actualizadoal06/01/13

Tk

Manejaexcepciones. Escapazdedocumentarunaaplicacinconsolousarelcomandordoc. Poseeaccesoaladocumentacininstaladadelsistema,medianteloscomandosriy fxri.

Poseeunacomunidadmuygrandededesarrolladores,loscualestodoeltiempo fabricanclasesyobjetosasombrosos.Parecenpersonasmuyfelicescomparti ndolo 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.96Betapag13/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.96Betapag14/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.96Betapag15/197actualizadoal06/01/13

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag16/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.96Betapag17/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.96Betapag18/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.96Betapag19/197actualizadoal06/01/13

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


rails new cualquiera cd cualquiera sudo bundle install

Fabricaelproyecto Entraalproyecto 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.96Betapag20/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.96Betapag21/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.96Betapag22/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.96Betapag23/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.96Betapag24/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.96Betapag25/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.96Betapag26/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.96Betapag27/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. .com heidisql

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

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag29/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.96Betapag30/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.96Betapag31/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.96Betapag32/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.96Betapag33/197actualizadoal06/01/13

http://lista.rubyargentina.com.ar/listinfo.cgi/rubyrubyargentina.com.ar http://librelist.com/browser/ruby enviarcorreoarubysur@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/r uby http://del.icio.us/karancho/ tutoriales

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag34/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.96Betapag35/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.96Betapag36/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 demsIDEcomosifuerantravestisllenosdeaccesoriosporencima.Portalrazneselideal

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

paraloscodemonkeys,geeks,aspirantesahackers,dueosdemaquinaslimitadas,o simplementeautodidactas. Vimpuedeserllamadodesdeconsola/msdosmedianteelcomandovim(austero,rpido, sinmen),ocomogvim(conbarradeiconos,mas"amable").Tambinexisteunaversin degvimanmasfcildeusarllamadaCream.

Vim / Cream en Windows


Descargabledesdevim.org.Enelasistentedeinstalacin,recuerdeactivarlaopcinFull,a findepoderlanzarlodesdeelpropioMSDOS. LoprimeroquedesagradaalosusuariosdeVimparaWindowseslamodalidadInsercin: sedebepresionar[i] paracomenzaraintroducirtexto.Paraevitarestamodalidad,se sugierelanzarvimmedianteeliconoVimEasy,obajarCreamdesdecream.sourceforge.net

Vim / Cream en Ubuntu Linux


Vim

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

Selollamadesdeterminalcomo"gvim"ocomo"vim". Cream

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

Selollamadesdelaterminalcomocream.

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag38/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 vim-rails rubygnome2 sudo gem1.8 install VimMate

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

Vim con Esteroides (Linux y Windows)


Avanzado:nuevamente,FabioAkitamuestracomoaprovecharexuberantctagspara agregarlevariascomodidadesalviejoyconfiableVim.Serecomiendaleerlanotapresente

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

enhttp://bunkerblog.blogspot.com/2010/03/yvimconocioakita.html

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

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

RedCar (Linux y Windows)


Eselnuevofavoritodelaslistasdecorreo.Libre,gratis,multiplataforma,liviano,einstalable simplementecomounagema.Soportaautocompletado,traealgunossnippets,yeselque 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.96Betapag41/197actualizadoal06/01/13

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag42/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.96Betapag43/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.96Betapag44/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.96Betapag45/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.96Betapag46/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.96Betapag47/197actualizadoal06/01/13

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

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag48/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.96Betapag49/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.96Betapag50/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 Fila 0 Fila 1 "1" 4 Columna 1 2 5 Columna 2 0,3 6

arreglo[1][1] => 5

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag51/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.96Betapag52/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.96Betapag53/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.96Betapag54/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.96Betapag55/197actualizadoal06/01/13

puts row[0] # primer campo puts row[1] # segundo campo end end

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

Bindings grficos
SepuedeprogramarventanasenRuby?Porsupuesto:Rubypuedeutilizardiversostoolkits grficos:

Tk wxRuby GTK

QT CocoaRuby(ObjetiveC,paraMac) 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.96Betapag57/197actualizadoal06/01/13

ejemplos,copiaryadaptarelcdigofuentedelosprogramasanuestrogusto.

Curiosidad:observarcomowxRubyimplementaloselementospropiosdecadasistema operativo,accediendodirectamentealaAPI DentrodelacategoraCommonsDialogs,sepuedeobservarloselementos


wxColourDialog wxFileDialog

Windows

Linux

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag58/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.96Betapag59/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.96Betapag60/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) 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 (@personaje2.fuerza +

Herencia
Laherenciaesmuysimple.Utilizaeloperador<

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

class JuegoV2 < Juego end

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag62/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.96Betapag63/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.96Betapag64/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.96Betapag65/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.96Betapag66/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 Modelo (ActiveRecord)

XML Json YML


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

select * from companies, where bla bla (a quien le importa?)

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.96Betapag67/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.96Betapag68/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.96Betapag69/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 [2010-03-02 15:24:01] INFO [2010-03-02 15:24:06] INFO WEBrick 1.3.1 ruby 1.8.7 (2010-01-10) WEBrick::HTTPServer#start: pid=11684 port=3000

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag70/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.96Betapag71/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,variasc modas interfacesgrficas,medianteunsimple(10)
10 Nuevamente,sideseaprofundizarenelusodeaptget/aptitude,bajeunacopiagratuitadelManualde RedesLibres,escritotambinporquienleescribeahora,ydescargabledesde http://www.bunker.org.ar/incubadora/redes.pdf.Elcaptuloquetrataelusodeaptgetes"Instalando binariosdesdelasfuentes".

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag72/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.96Betapag73/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.96Betapag74/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.96Betapag75/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.96Betapag76/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.96Betapag77/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.96Betapag78/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> + + + + + + + + </html> </body> </head> <body> &iexcl;Holas Manolas! </title> Holas Manolas! <head> <title> Bienvenido al Sistema

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.96Betapag79/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"

Tambinpuedevertodaslasramasqueincidansobreelproyectohaciendo
git log --pretty --graph --color

Ahoratendremoslaposibilidaddehacergitlogennuestroproyectoyobtenerunresumen muchomasclaro.SrvaseentraralapginadeBartparaveralgunosejemplos.

Interface GIT en modo texto


Tig.Paraquemas?Srvaseobservarlacaptura depantalla.

Interfaces grficas
Sideseaalgomassofisticado,sealegrarsaber delaexistenciadegitcola,gitgui,gitk,qgit, gitgyelgrandiosomeldcomocomparador. Puedeinstalarcualquieradeestasherramientas medianteaptget,yescogerlasllamndolaspor sunombrepararevisarelcambioentodala carpeta,ohaciendoun

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

git difftool archivo

Otrabuenacombinacinconsisteenobservarloscambios,ejecutandoenlarazdel proyectoagitcola.Cuandohemosdetectadoalgunoenparticular,podemoscompararsu historialdemodificacionesyendoalmenDiffCommits,yescogercommitsanteriores (StartCommit),conrespectoalltimo(EndCommit).Meldseabrirmostrando exactamentelaslineascambiadas.

Trabajar con ramas y nmeros de versin


Lasramasdedesarrollosonmuyconocidasenelmundodelsoftwarelibre.Yprcticamente unanecesidad,yaquecobrancabalutilidadcuandomuchaspersonasaportantrozosde cdigo,inestableshastaquesedemuestrelocontrario. Tambinenformalocalpodemosbeneficiarnosdeestainteresantepropiedadqueposee GIT:supongamosquedeseamosintroduciruncambioennuestrosistema.Predecimosque lanaturalezadeestecambiopuedetenerconsecuenciasenmuchassecciones.

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

Entretanto,necesitamosunaversin"estable"queofreceranuestrosclientes.Estoimplica 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

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

tambinqueenchufaremosgemasescritasporotraspersonas,queprobablemente 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:
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.96Betapag83/197actualizadoal06/01/13

git add . 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 db/migrate/20100314175320_create_depositos.rb create app/models/deposito.rb invoke test_unit create test/unit/deposito_test.rb create test/fixtures/depositos.yml route resources :depositos invoke scaffold_controller create app/controllers/depositos_controller.rb invoke erb create app/views/depositos create app/views/depositos/index.html.erb create app/views/depositos/edit.html.erb create app/views/depositos/show.html.erb create app/views/depositos/new.html.erb create app/views/depositos/_form.html.erb create app/views/layouts/depositos.html.erb invoke test_unit create test/functional/depositos_controller_test.rb invoke helper create app/helpers/depositos_helper.rb invoke test_unit create test/unit/helpers/depositos_helper_test.rb invoke stylesheets create public/stylesheets/scaffold.css

Masadelantehablaremosdelaconvenienciadenombrareninglesalasclases,tablasy camposdelosproyectos."Deposito"sedeberahaberllamado"Depot","encargado"

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

deberahabersellamado"manager",yas.Esdecir,hemosmetidolapata. Anopreocuparse!Enestaocasin,haytodaclasedecosasnuevas.Demodoque 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.96Betapag85/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.96Betapag86/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.96Betapag87/197actualizadoal06/01/13

aunquepodemosignorarlassimplementesaliendo.

Siahoracorremosnuevamenteelserverdepruebas,estedeberainiciarsinproblemas.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag88/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.96Betapag89/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.96Betapag90/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.96Betapag91/197actualizadoal06/01/13

Captulo5
Captulo 5: Hola Mundo en Rails
CuandoelnavegadorhaceunsolicitudalservidorWeb,yestaesparseadaalaaplicaci n 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.96Betapag92/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.96Betapag93/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.96Betapag94/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,demodoquesiqueremosrealizaroperacionesmatem ticas sobrel,debemosconvertirloaentero(.to_i).
15 Seexponeesteejemplo,dedicadoaaquellosprogramadoresquegustandeunificartodo.Dosframeworks pequeosypotentesquenoimplementanMVC,ymantienentodaslascosasunidas,sonPadrinoySinatra. OcomodiraFontanarrosa:"elsigloXXInosencontrarunidosyamontonados".

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag95/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.96Betapag96/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"

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

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

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

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

Sitodoanduvobien,ahorahttp://localhostdeberamostrarnos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag98/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.96Betapag99/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.Estonosorprendenimolestaaning n 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.96Betapag100/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.96Betapag101/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 create create invoke create create active_record db/migrate/20100314191942_create_empresas.rb app/models/empresa.rb test_unit test/unit/empresa_test.rb 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.96Betapag102/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.96Betapag103/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.96Betapag104/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.96Betapag105/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,unamaneradenopreocuparseporlosdetallesdeimplementaci nde labasededatos,consisteenutilizarSQLite,almenosparalasetapasdevelopmentytest. Luegopuedeusaradaptadoresparaotrascosasmaspotentes.Entoncesrakeseencargar decrearunabasadaproductionsobre,porejemplo,PostgreSQL,conlaestructuradela basedevelopment. LasbasesRDBMSnormalmenteatiendenenunpuerto,custodiadoporunservicioo "daemon",yocupandorecursosinclusocuandonoselasutiliza.PeroparausarSQLite,no hacefaltainstalarmasqueunospocospaquetesbsicosylasgemas.Unamala

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag106/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.96Betapag107/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 exists exists create exists exists exists create exists create create create create create create create app/models/ app/controllers/ app/helpers/ app/views/companies app/views/layouts/ test/functional/ test/unit/ test/unit/helpers/ public/stylesheets/ app/views/companies/index.html.erb app/views/companies/show.html.erb app/views/companies/new.html.erb app/views/companies/edit.html.erb app/views/layouts/companies.html.erb public/stylesheets/scaffold.css app/controllers/companies_controller.rb

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

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

create create create route dependency exists exists exists create create create create create

test/functional/companies_controller_test.rb app/helpers/companies_helper.rb test/unit/helpers/companies_helper_test.rb map.resources :companies model app/models/ test/unit/ test/fixtures/ app/models/company.rb test/unit/company_test.rb test/fixtures/companies.yml db/migrate db/migrate/20100111165913_create_companies.rb

Corremoslamigracin:
rake db:migrate == CreateCompanies: migrating ================================================ -> 0.0057s == CreateCompanies: migrated (0.0061s) =======================================

-- create_table(:companies)

AbrimosFirefoxenladireccinhttp://localhost:3000/companies

Nadamalpara2(dos)lneas.

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

Observelalneaqueconstruyelaclaseo"modelo",app/models/company.rb.Tambi n 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.96Betapag110/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.96Betapag111/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.96Betapag112/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.96Betapag113/197actualizadoal06/01/13

Captulo8
Captulo 8: Validaciones
Validaresunpasoaburridoduranteeldesarrollodetodaaplicacin.Suobjetoesimpedirla entradadedatosquecorrompanlabase.No,nosetratadedinero.Setratadevalores vacos,repetidos,letrasenlugardenmeros,etc.Desgraciadamente,esunpasoquelos programadoresdebenhacerloporduplicadoentodaslasetapasdelaaplicaci n: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.96Betapag114/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.96Betapag115/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.96Betapag116/197actualizadoal06/01/13

Concretamente,elarchivocomprimidocontiene: Archivoejemplo
app\models\company.rb app\views\layouts\companies.html.erb public\images\avatar_sergio.png public\stylesheets\sergio.css

Explicacin
Lasvalidacionesqueyavimos. Ciertaszonas(<div>)queRails"renderea"antesque lasVistas(edit.html.erb,index.html.erb,new.html.erb, etc.) Laimagendearribaalaizquierda. Desarrollodelaszonas(<div>)solicitadasporellayout. Estoesubicacin,margenes,colores,etc

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag117/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.96Betapag118/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 exists create exists exists exists exists exists create create create create create identical create create create create route dependency exists exists exists create app/controllers/ app/helpers/ app/views/departments app/views/layouts/ test/functional/ test/unit/ test/unit/helpers/ public/stylesheets/ app/views/departments/index.html.erb app/views/departments/show.html.erb app/views/departments/new.html.erb app/views/departments/edit.html.erb app/views/layouts/departments.html.erb public/stylesheets/scaffold.css app/controllers/departments_controller.rb test/functional/departments_controller_test.rb app/helpers/departments_helper.rb test/unit/helpers/departments_helper_test.rb map.resources :departments model app/models/ test/unit/ test/fixtures/ app/models/department.rb

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

create create exists create

test/unit/department_test.rb test/fixtures/departments.yml db/migrate 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 ============================================== -> 0.0054s

-- create_table(:departments) == CreateDepartments: migrated (0.0059s) =====================================

Oalgoas...

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag120/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,ylesexplicamosaRails queunacompaa puedetenervariosdepartamentos.Entantoqueundepartamentoperteneceraunasola compaa. Sirecuerdanlasreglasdeintegridadreferencial,recordarnelviejoadagio"enunarelacin deUnoaMuchos,laclavedelosunos(Compaa)seencuentradelladodelosmuchos

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag121/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:
class Customer < ActiveRecord::Base has_many :orders, :dependent => :delete_all, :validate => :false end

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

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.96Betapag123/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.96Betapag124/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.96Betapag125/197actualizadoal06/01/13

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag126/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.96Betapag127/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.96Betapag128/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 create db/migrate 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 =============================================== -> 0.0028s == AddCuitToCompany: migrated (0.0032s)

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

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag129/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.96Betapag130/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"] %> Enelcasodelaformadinmica,necesitamostenerunarelacinhas_manyenelmodelo,y unavariablerepetidavariasvecesenelcontrolador.Larelacinyalatenemos,demodo queenelcontrolador[app/controllers/departments_controller.rb],concretamente enlasaccionesaccionesedit, 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.96Betapag131/197actualizadoal06/01/13

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

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

<%= f.select :company_id, @companies.map {|comp| [comp.name, comp.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.96Betapag132/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.96Betapag133/197actualizadoal06/01/13

Tengo muchas tablas, ndices y campos!


Estrategia 1
Crearautomticamentediagramasdemodelosycontroladores Enunafaseavanzadadelproyecto,puedeconfundirnosla cantidaddetablasmodelosycontroladoresinteroperandoentre s.AlgunosIDEpagos,comoRubymine,poseenfuncionalidades muybuenasentalsentido.Sinembargo,podemosseguir mantenindonos"libres",yusarRailroadyensulugar.
sudo apt-get install graphviz

Luego,incorporaraGemfile
group :development, :test do gem 'railroady' end

Lossiguientessonautoexplicativos
bundle install rake diagram:all nautilus doc/

Tambinpodemosgenerararchivospngenlugardesvg,medianteloscomandos
railroady -C | dot -Tsvg > doc/controladores.svg railroady -M | dot -Tsvg > doc/modelos.svg

//TODO:ComprobarconfiguracionenRails3.2.xbajoWindows

Enlacarpetadoc/deberanaparecerlosdiagramas.Elformatoes.svg,esdecirvectorial xml,formateableconcualquierherramientadedibujocomoInkscape,CorelDraw, Ilustrator,etc,einclusouneditordetextos! Sepuedecambiarlacadenasvgporpng,masportable.Peroentantoquesvges fcilmenteformateablemediantelosprogramasmencionados,losarchivospngrequieren

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

detodaclasedemaquillajeporpartedealgnprogramadeedicindefotos. Sialgofalla,esporquenoestnbientrazadaslasrdenesbelongs_to,has_many,etc.

Parapodervisualizarlosdiagramasenformatosvg: Windows:

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

Linux:

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

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag135/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 name address active :integer :string(255) :string(255) :boolean not null, primary key

created_at :datetime updated_at :datetime

class Company < ActiveRecord::Base has_many :departments end

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag136/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.96Betapag137/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.96Betapag138/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.96Betapag139/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.96Betapag140/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,introduciremoselsiguientecambios(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.96Betapag141/197actualizadoal06/01/13

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

Asimismo,quitaremoslalineaquefiguratachada(t.timestamps)paraevitarlidiarcon constraintsdetiponotnullenSqlite. Ahorasi,corremoslamigracin:


rake db:migrate == CreateProjectsDepartments: migrating ====================================== -> 0.0050s == CreateProjectsDepartments: migrated (0.0055s) =============================

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

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

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

Controlar la relacin

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.96Betapag143/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.96Betapag144/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.96Betapag145/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| \-+ >> RRHH Auditora Administracin Mercadeo Finanzas Investigacin Ventas (un montn de otras cosas) ==> puts d.name end

Estadsticas

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag146/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.96Betapag147/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| \-+ >> Ventas Administracin puts x.name end

(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.96Betapag148/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.96Betapag149/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.96Betapag150/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,alprincipiodelaacci nupdate(laque recibelosvaloresdelavistaedit),paraevitarelproblemacitadoen http://asciicasts.com/episodes/17habtmcheckboxesrespectodecuandoningn checkboxhasidoclickeado,hayqueponerlosiguiente:
def update params[:department][:project_ids] ||= [] @department = Department.find(params[:id])

EntantoqueaquellosqueestnprobandoesteejemplosobreRails3.2.11(railsvmuestrala versin),debendejarcomoprimeralinea
class Department < ActiveRecord::Base attr_accessible :company_id, :name, :project_ids belongs_to :company has_and_belongs_to_many :projects end

Elerrorqueaparece,denocumpliresepaso,esel ActiveModel::MassAssignmentSecurity::ErrorinDepartmentsController#update

Algo mas respecto de las vistas:


Lointeresantedehaberrealizadoloscambiosenelparcial app/views/departments/_form.html.erbenlugardelavista

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

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

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag152/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.96Betapag153/197actualizadoal06/01/13

Jugando con MVC

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag154/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 exists exists exists exists create create create create

app/controllers/ app/helpers/ app/views/frontend test/functional/ test/unit/helpers/

app/controllers/frontend_controller.rb test/functional/frontend_controller_test.rb app/helpers/frontend_helper.rb 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.96Betapag155/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 Encadaunodelos<div>usaremosbuclesmuyparecidos:
<% Company.find(:all, :conditions => {:active => true}).each do |c| %>

ydown.png

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.96Betapag156/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.96Betapag157/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 estadodecampotrueporfalse,ofalseportrue. Primerobuscamosunregistroconese:id,yloinstanciamosenunobjetomodificar


modificar = Company.find(params[:id])

oen

,yporlotanto,deseael

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


modificar.save

Lavistasedisparaautomticamentecuandolaaccinterminasuejecucin.Mostrando comolaempresacambiaentrecajas<div>

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag158/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.96Betapag159/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.96Betapag160/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.Laraz ndeaprenderaadministrarLinux... estenertiempolibredentrodelaempresa. 22 DemostraremosquenoesdifcilmontarunserverdeproduccinenWindows.Noqueseaseguro.

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag161/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.96Betapag162/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.96Betapag163/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.96Betapag164/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.96Betapag165/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.96Betapag166/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. 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. This could take a while... Successfully installed passenger-2.2.9

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag167/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.96Betapag168/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.96Betapag169/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 <Directory /home/s/demo/public> AllowOverride all Options -MultiViews </Directory> </VirtualHost> # <- Atencin al public final # <- Atencin al public final

Estenewstyledeconfigurarunarchivoporcadaaplicacin,seraimposibledereproducir enWindows,debidoaNTFScarecedelacapacidaddeconstruirlinkssimblicos.Estos elementosseparecenalosaccesosdirectos,conladiferenciaqueloslinkssimblicos puedenserseguidosporprogramas.Apachepuedeseguirunlinkhastasuubicaci nfinal, 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.96Betapag170/197actualizadoal06/01/13

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag171/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.96Betapag172/197actualizadoal06/01/13

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag173/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.96Betapag174/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

DebemostenerencuentaqueHerokuusaPostgreSQLcomobasedeproduccin.Si queremosSqliteennuestramodestamaquinadedesarrollo,yPostgreSQL,debemosincluir lasiguientesentenciaenelGemfile


gem 'sqlite3', :group => [:development, :test] group :production do gem 'pg' end

Luegoconvieneinstalarlassiguientesdependenciasparaconstruirlagemapg:
sudo apt-get install libpq-dev build-essential

Yahorasi,comosiempreluegodecualquiercambioenGemfile
bundle install //TODO (terminar)

AhoracreamosunproyectodentrodelclusterHeroku.Nousecomonombredeproyecto demoyaseencuentrausada...pormi:P
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

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

Sinolohemoshecho,pedimosagitqueseinstalesurboldecambios
git init .

Agregamoslafuenteremota
git remote add heroku git@heroku.com:demo.git

Tcnicamente,laordengitremoteaddagregapornosotrosenelarchivo.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 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,encontraremosquenuestramodestabase dedatos,lacualseencuentraendb/development.sqlite3,probablementenohasubido:

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

.bundle db/*.sqlite3 log/*.log tmp/**/*

Lamaneraobviadepermitirsubiralabasedb/development.sqlite3aproduccinsera quitardb/*.sqlite3de.gitignore,perosiunosedetieneapensarlo,locoherenteseracorrer lasmigracionessobrepostgresql,aligualqueheroku,elcualsindudadebeestarmuy optimizado,puestoquesirvedecenasdemilesdeaplicacionesporsegundo. Igual,nohayquepreocuparseconesto,porqueActiveRecordnosdaindependencia respectodelabasequeseusaenproduccin(podrahabersidoMongodb,MySQLuotra cosa). Lalneadb/*.sqlite3existepordefectoporsiutilizamossqlitetambinenelserverde produccin,ynoqueremossobrescribirconverduralosdatosqueendefinitiva,nosest n dandodecomer. Siestamossegurosdenosobrescribirarribadatosimportantes,ytenemoslagemataps, podemosquitaresalnea,yempujarlabaseentera,conmigracionesytodo:
s@mandragora:~/demo$ heroku db:push

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...

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

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

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

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

users: 00:00:00 pages: 00:00:00 comments: 00:00:00 tags: 00:00:00

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

Receiving indexes Resetting sequences

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag179/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.96Betapag180/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 break catch condition delete disable display down enable eval exit finish help info irb list next p pp ps quit reload restart save show source step thread undisplay up var where

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag181/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 5 6 7 => 8 9 10 11 12 def check debugger @bugs = Bug.all @bugs.each do |bug| params[:cb_].each do |parametro| if bug.id == parametro.id bug.accepted = true @bichos = Bug.all end

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.96Betapag182/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.96Betapag183/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.96Betapag184/197actualizadoal06/01/13

AutoressobreTutoriales:

https://twitter.com/railstutorial MichaelHartl,elcreadordeunlibromejorqueeste. https://twitter.com/RubyLearning SatishTalim,Guru https://twitter.com/samruby Otrogranescritor https://twitter.com/raymicha RaymiSaldomando,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/dhh DavidHeinemeierHansson,ElcreadordeRuby https://twitter.com/soveran :MichelMartens https://twitter.com/AkitaOnRails :FabioAkita https://twitter.com/luislavena :LuisLavena https://twitter.com/drnic ElincrebleDrNic https://twitter.com/karancho Yo:)

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

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag185/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 vim cheat has_many cheat rails cheat unix cheat cucumber cheat wife

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

ApndiceB
Links Recomendados & Imperdibles
EnIngles

Libros

Gratis:

www.r ailstutorial.org AgileWebDevelopmentwithRails,CuartaEdicinprcticamentelabibliade Rails

Pagos

Revistas,gratis:

http://railsmagazine.com www.railscasts.com http://globalplaza.org/spaces/conferenciarails/videos http://teachmetocode.com/screencasts

ScreenCastingsyvideosgratis

Tutorialesasistidos

Gratis

http://tryruby.org PequeoTutorialonlinesobreRuby http://railsforzombies.org TutorialonlinesobreRuby,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.96Betapag187/197actualizadoal06/01/13

Lapresenteobra,versinenpapel,idealparalacarteradeladama,yel bolsillodelcaballero.

Casting,Videos:

http:// es.asciicasts.com

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

Polgono de tiro para captulos nuevos


Codemonkeystrabajando:

Entrarconcasco

SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag189/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. http://railscasts.com/episodes/209introducingdevise (ysuversionasciicasts) 3. http://railscasts.com/episodes/210customizingdevise (ysuversionasciicasts) Lospasos,entrminosgenerales,son:

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' }

Estalneadebesercorregidacuandolaaplicacinseasubidaenproduccinenunserver concapacidaddeenvodecorreo. Quedaindicaralgunarutapordefectoenconfig/routes.rbojoelplural.Yoescogi (ADAPTAR)


root :to => "bugs#index"

Salirdeconfig/routes.rb,porqueenseguidaelgeneradordevisevaatocarlo.

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

rails generate devise User invoke create invoke create create inject create route active_record app/models/user.rb test_unit test/unit/user_test.rb test/fixtures/users.yml app/models/user.rb db/migrate/20100412200407_devise_create_users.rb 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,yaaparececiertainformacinmuytil.Ejemplo: Ruta new_user_session user_session Mtodo GET POST Formato /users/sign_in(.:format) /users/sign_in(.:format) Directorio/controlador/accin devise/sessions#new devise/sessions#create

destroy_user_session DELETE

/users/sign_out(.:format) devise/sessions#destroy

Estosdatosqueaprimeravistanotienensentido,sonmuytilescuandoexaminamosla trazadelrailsserver(odellogequivalenteenlacarpetalog/). Porejemplo,laltimalneaeslarutaqueeligeeldispatchercuandovemospasarun


Started DELETE "/users/sign_out" for 127.0.0.1 at 2013-02-06 16:58:33 -0300 Processing by Devise::SessionsController#destroy as HTML

Significaqueunusuarioharealizadounsign_out,yporlotantosehadestruidosusesin.

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

Railsyotrosframeworks,comoSinatrayPadrino,haceusodeestassimplesinstrucciones RESTparaquiendeseelodeseeusarcomounaAPIdeWebservices. Paraquenossirveestodelasrutas,mepreguntaran.Bueno,puesnospermitenescribir fcilmentecdigo.Volvamosalejemplodelalnea destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy

Conestopodemosescribirunlogoutdelasiguienteforma:
<%= link_to "Salir", destroy_user_session_path, :method => :delete %>

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 %>. No eres tu? <%= link_to "Salir", destroy_user_session_path, :method => :delete %> <% else %> <%= link_to "Inscribirse", new_user_registration_path %> or <%= link_to "Entrar", new_user_session_path %> <% end %> </div>

Loquesetraduceenquesielusuarionoestlogueado,leaparecernlasopciones Inscribirse(Signup)/Entrar(SignIn) Siporelcontrario,yaseencuentralogueado,mostrarsolamentelaopcinparahacer Salir(Logout).

Tu Ruta es mi Ruta (link_to & rake routes)


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

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

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"}

AsescomoseconstruyeelEntrardelejemplo,querecordemos,seveacomo:
<%= link_to "Entrar", new_user_session_path %>

Su identificacin, por favor


Quedaasegurarenloscontroladores,lgicamenteelaccesoalasacciones. 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

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

<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.96Betapag194/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.96Betapag195/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.96Betapag196/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.96Betapag197/197actualizadoal06/01/13

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

Das könnte Ihnen auch gefallen