Beruflich Dokumente
Kultur Dokumente
96Betapag1/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag2/197actualizadoal06/01/13
Udpodraestarleyendounacopiavieja!
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
] ] ] ] ] ]
[ 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
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.
1 Amenosquedepuromalvado,ymedianteGimp,muestrecosasqueenrealidadnofuncionan... muajajajah!
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag10/197actualizadoal06/01/13
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.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag12/197actualizadoal06/01/13
Tk
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.
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
Puedereemplazarruby1.8por1.9simplementecambiandoelnumero8porel9enel nombredelospaquetes.Entrminosgenerales:
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
4. Sigemyaestinstalado,puedeactualizarlomediante
gem update --system
5. Probemosinstalandounalibreranecesaria:
gem 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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag19/197actualizadoal06/01/13
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:
Luegoejecute
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag20/197actualizadoal06/01/13
Unavezterminadalainstalacin,convienerevisarlaversin: rails -v
Antesdecomenzaraprobar,decidaquetipodebasededatosdeseausar,yavanceunos captulosparachequearlainstalacinnecesaria.
Finalmente,podrinstalarSQLitemediante
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag21/197actualizadoal06/01/13
sudo apt-get install make ruby-dev mysql-server libmysqlclient-dev sudo gem1.8 install -V mysql
Luego,busqueaphpmyadminenhttp://localhost/phpmyadmin
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag22/197actualizadoal06/01/13
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
RDOC y RI
Quizsustedesdelosprogramadoresquenolesgustatrabajarenmanualesdesus aplicaciones.Manualesqueprobablementesususuariosnoleern.Entonceslealegrar saberqueRubyposeeuncomandollamadordoc.Alestilodejdoc,estecomando, ejecutadoenlarazdelaaplicacin,puedecrearnosautomticamentelamayorpartede ladocumentacin.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag23/197actualizadoal06/01/13
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
Sinembargo,RubyInstalleryaproveeunaccesodirectoatalefecto,quepuede encontrarseenInicioProgramasRubyStartCommandPromptwithRuby
DevKit
Algunospasosnecesitarandeciertaslibrarasinstaladasenelsistemallamadas DevelopmentKit.ParaellosbajamoselarchivoautoextraibleDevKittdm32x.x.x.sfx.exede lapaginadeRubyInstaller,presenteenhttp://www.rubyinstaller.org/downloads/ Desinstalamoselcontenidoenalgunacarpeta,C:\DevKitporejemplo.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag26/197actualizadoal06/01/13
1.
2.
3.
Esteltimopaso(3)sirveparachequearquelaslibrerashasidoinstalados(2) correctamenteenelpathdeRuby(1),ennuestroejemplo,existenteenC:\Ruby187
Comoprimeramedida,antesdeinstalarRails,proveeremosalgunasgemasparagestionar basesdedatos:MySQL,SQLiteyMSSQL.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag27/197actualizadoal06/01/13
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag29/197actualizadoal06/01/13
https://addons.mozilla.org/es-ES/firefox/downloads/latest/5817
6 EnrealidadnoestanraroquequeciertospluginsparaFirefoxofrezcanmejoresfuncionalidadesque programasclsicos:bastasoloobservarafireftpoafirebug.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag30/197actualizadoal06/01/13
Paraconectarcontraestabasededatos,paseeunmomentopormisfavoritos: http://delicious.com/karancho/mssql+rails
SipreferimosusarMySQL
rails new prueba --database=mysql
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
Luego,carguelasdirecciones:
http://localhost:3000/rails/info/properties http://localhost:3000/students
Sialgofalladurantealgnpaso:
Sipersisteelmismomensajedeerror,entoncesserelmomentoderevisarinformesde ltimomomentoen
http://guides.rails.info YlosrecomendadosdeLuisLavena,elgeniocreadordeRubyInstaller:
Porsupuesto,nodejeacudiraalgunasdelasexcelenteslistasdecorreos
Enespaol:
http://lists.simplelogica.net/mailman/listinfo/rores
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag33/197actualizadoal06/01/13
Eninglesycomocuriosidad,parachicas!http://railsgirls.com
Finalmente,puedemantenerseactualizadoacudiendoamisvnculosbookmarkeadosen
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.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag37/197actualizadoal06/01/13
Selollamadesdeterminalcomo"gvim"ocomo"vim". 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
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag39/197actualizadoal06/01/13
enhttp://bunkerblog.blogspot.com/2010/03/yvimconocioakita.html
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag40/197actualizadoal06/01/13
sudo apt-get
install libzip-ruby1.8
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag41/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag42/197actualizadoal06/01/13
IDEs
Hastaahoravenamoscomentandosimpleseditores.Acontinuacinsepresentanentornos mascompletos,capacesdegestionarservidores,debuggearyasistiraprogramadoresmas experimentados.Noserecomiendasuusoalosnovatos,yaqueretrasaranintilmenteel aprendizajeinicialdeRuby.
AptanaStudio(LinuxyWindows)
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag43/197actualizadoal06/01/13
DebugintegradoconFirefox,comodetalleinteresante,yaqueRubytraeun debuggerpropio,quepuedeustedconsultarenelApndiceA.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag44/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag45/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag46/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag47/197actualizadoal06/01/13
8 http://www.trazosweb.com/2009/09/16/comoconvertirunpsdaxhtmlycss/
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag48/197actualizadoal06/01/13
Captulo2
Losbuenosprogramadoressepasanlavidaprogramando. Losexcelentesprogramadores,sabenquecopiaryquepegar. EricRaymond
Paralosejemplosaquvertidos,cualquierRubyconversinigualosuperiora1.8.7debera bastar.
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...
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
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}
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag54/197actualizadoal06/01/13
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.
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag62/197actualizadoal06/01/13
Clases temporales
Sinecesitamosmomentneamenteunmtododeunaclase,ynadamas,podemos instanciarunaclasesinocuparnosdepensarenunnombre,nitenerquedestruirlomas tarde.
Juego.new(arturo,smaugh).combat
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.
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.
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
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:
Lagrandiferencia,esquelos
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag66/197actualizadoal06/01/13
programadoresdeRailsseacordaronqueMVCdebasersimple. Veamosunejemplobsico
Navegador
SWF
Flex
SQL / NOSQL
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.
MientrasqueenMySQL,lamismaconsulta,serepresentacomo
SELECT * FROM companies 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.
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
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.
Yluego
rails server mongrel
otambin
rackup --server mongrel --port 3000
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag71/197actualizadoal06/01/13
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:
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag73/197actualizadoal06/01/13
comoprogramadoresconexperiencia.
Recordemos:
Abrimosotraconsola/MSDOS,entramosnuevamentealaaplicacinmediantecddemo,y creamosunrepositoriolocal:
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag74/197actualizadoal06/01/13
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(-)
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag75/197actualizadoal06/01/13
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.
Realizaremosunanuevaentrega.Cuandonohaymuchoqueinformar,ynoqueremos entraraleditor,podemosutilizarelmodificadorm,seguidodeunabrevedescripcin.
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
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> ¡Holas Manolas! </title> Holas Manolas! <head> <title> Bienvenido al Sistema
Podemosobservarenrojo()laslneasmovidasoquitadas,yenverde(+)lasagregadas.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag79/197actualizadoal06/01/13
Tambinpuedevertodaslasramasqueincidansobreelproyectohaciendo
git log --pretty --graph --color
Ahoratendremoslaposibilidaddehacergitlogennuestroproyectoyobtenerunresumen muchomasclaro.SrvaseentraralapginadeBartparaveralgunosejemplos.
Interfaces grficas
Sideseaalgomassofisticado,sealegrarsaber delaexistenciadegitcola,gitgui,gitk,qgit, gitgyelgrandiosomeldcomocomparador. Puedeinstalarcualquieradeestasherramientas medianteaptget,yescogerlasllamndolaspor sunombrepararevisarelcambioentodala carpeta,ohaciendoun
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag80/197actualizadoal06/01/13
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag82/197actualizadoal06/01/13
Encualramaestamosparados?
git branch * master testing
Cambiamosalaramatesting:
git checkout testing M public/bienvenida.html
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag83/197actualizadoal06/01/13
Simiramosahorahavueltotodoalanormalidad!
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
Ycomonohemosrealizadotodavaningunaentrega("commit"),rebobinamostodoslos cambios,hastaelltimocommit.
git checkout -f
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"
Estecomandoiniciaunadescargadedatoshacialacarpetavendor/plugins. Ledecimosalrepositorioquereviseelrbolenbuscadecarpetasyarchivosnuevos.
git add .
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag86/197actualizadoal06/01/13
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'
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
Podemosvolvereneltiempoabsolutamentetodo,destruyendotodoslos cambios,hastaelltimocommit:
git reset --hard HEAD^
Sideseamosvolver#versioneshaciaatrs(revisarprimerocongitlog)
git reset --hard HEAD-#
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag90/197actualizadoal06/01/13
Entramosalacarpeta,mediante
cd demo
Corremoselserverenmodotesting,ylodejamosmostrandosusoperacionesinternas:
rails server ruby script\rails server
InstalamosGIT.Posteriormente,creamosunrepositoriolocal.
git init
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
Enelsiguientecaptulovamosaintentarnuestraaplicacinrespondadeformadistintaalas siguientessolicitudes:
/hola Enestecasoelnavegadordebemostrarunsimple"holaMundo"
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag93/197actualizadoal06/01/13
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
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
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
Estearchivonoexiste,demodoquelocreamosconelsiguientecontenido
<h1>Pgina principal</h1> o tambin <h1>Pá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:
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
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag102/197actualizadoal06/01/13
Estearchivocumpledospropsitos:enunosinstantes,serutilizadoporunscript llamadorake,queutilizarlasdefinicionesexistentesenlpara:
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) ========================================
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag103/197actualizadoal06/01/13
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
Nota:derealizaralgncambioenlosmodelos,sedebevolveraingresararails console,yreiniciarporciertorailsserver
Resumen
Esperoquehayadisfrutadodeestaseccin.Sibienescompleja,esmuyposiblequedeba tenerlaencuentaparacuandomigresusaplicacionesactualesaRails. Noobstante,noutilizaremoslaclaseEmpresanisusmodelos,sinosusequivalentesen ingls,demodoquedaremosvueltaatrscontodasestasanticonvenciones:
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag105/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag106/197actualizadoal06/01/13
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
AvisamosaGITquecomienceaseguiralosnuevosarchivos:
git add .
Siesttodobien,entregamosloscambiosmediante
git commit -m "Scaffold de Compaias"
Casocontrario
git checkout -f
Enestafase,esimprescindiblerevisarlamagiadetrsdescaffold
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag110/197actualizadoal06/01/13
Muybienlosandamios...perodondealmacenanlosdatos?
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag111/197actualizadoal06/01/13
AllnosencontraremosconunmontndeinstruccionesSQLquehechoActiveRecordpor nosotros:instruccionesCREATETABLE,CREATEDATABASE,etc.
Estecomandomantienecapturadalaterminalmientrasrelata(tail)loscambiosalfinalde
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag112/197actualizadoal06/01/13
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
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
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag119/197actualizadoal06/01/13
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
==
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
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag123/197actualizadoal06/01/13
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
Observarlasordenesintroducidas,comenzadascon>> ObtenemoslaRailsConsoleenlarazdelproyecto,mediantelaorden
ruby script/rails console rails console
Querido diario...
PorabajoestnocurriendolasverdaderastransaccionesSQL.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag125/197actualizadoal06/01/13
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.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag127/197actualizadoal06/01/13
<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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag128/197actualizadoal06/01/13
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)
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag130/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag131/197actualizadoal06/01/13
<!--[eoform:department]-->
Muchocdigo?laultimamodaenRails!:unhelper.Lograel<SELECT>anteriorcon...una solalnea.ProbablementenosellevebienconAjax,peroesbastantesinttica.
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
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag134/197actualizadoal06/01/13
detodaclasedemaquillajeporpartedealgnprogramadeedicindefotos. Sialgofalla,esporquenoestnbientrazadaslasrdenesbelongs_to,has_many,etc.
Parapodervisualizarlosdiagramasenformatosvg: Windows:
InstalarpluginSVGdeAdobeparanavegadoresExploreryFirefox: http://www.adobe.com/svg/viewer/install/
Linux:
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
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
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:
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag138/197actualizadoal06/01/13
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
rake db:migrate
Enhttp://localhost:3000/projectscargamosdosproyectosconloscualesjugar:
Reducircostos Identificarnichosdemercado
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag140/197actualizadoal06/01/13
rails generate scaffold departments_projects project_id:integer department_id:integer ruby script\rails generate scaffold departments_projects project_id:integer department_id:integer
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
-- create_table(:projects_departments, {:id=>false})
Yenapp/models/project.rb
class Project < ActiveRecord::Base has_and_belongs_to_many :departments end
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag142/197actualizadoal06/01/13
Controlar la relacin
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag143/197actualizadoal06/01/13
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 -->
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag145/197actualizadoal06/01/13
01-18 04:03:23">
Yatenemosdosproyectos,quesesumanalosotrosdosquehabamoscargadodesde http://localhost:3000/projects,recuerdan?eran:
Reducircostos Identificarnichosdemercado
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
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">]
Luegoagregamoslassiguienteslneasanuestroarchivo$HOME/.irbrc Estascargarnhirbencadallamadaairb,yconsecuentementearailsconsole:
require 'rubygems'
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag148/197actualizadoal06/01/13
Pruebenlasiguientecombinacin:
rails console ruby script\console irb(main):001:0> table ['pepe', 'pipa'] +-------+ | value | +-------+ | pepe | pipa | |
Luego,abrimosunconsolayescribimos.
rails console irb(main):001:0> require 'hirb' irb(main):002:0> extend Hirb::Console irb(main):003:0> Hirb::View.enable
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag149/197actualizadoal06/01/13
Ejercicios propuestos
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
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag154/197actualizadoal06/01/13
Porlotanto,utilizamoslaorden
rails generate controller frontend activas ruby script\rails generate controller frontend activas
create app/views/frontend/activas.html.erb
Siobservamosatentamente,paralelaalaaccinsehacreadounavistaconelmismo nombre.
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",
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
oen
,yporlotanto,deseael
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.
20 BastardOperatorfromHell.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag160/197actualizadoal06/01/13
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
Preparar Base
1) Comoprimerpaso,copiamoslaaplicacinhaciaotracarpetaquedebeestar destinadaaproduccin,porejemplo
C:\InstantRails-2.0-win\rails_apps\demo-production
Estecomandorealizarlassiguientesacciones
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag162/197actualizadoal06/01/13
MediantelaConsoladeAdministracindeWindows
DeberamosveraMongrelenproduccin,siapuntamoselnavegadora http://127.0.0.1:4000
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag163/197actualizadoal06/01/13
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:
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
Siadivinan,estalineaapuntarreferenciasdeltipo"http://demo"hacialaipdela computadoraqueseencuentrasirviendo.Enelejemplo:192.168.1.33
Errores
Siobtenemoserrores:
23 LospasosparainstalarunCacheDNSbajoLinuxpuedeconsultarlosenelManualdeRedesLibres,del mismoautor,enladireccinhttp://www.bunker.org.ar/incubadora/redes.pdf
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag165/197actualizadoal06/01/13
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
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!
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/
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
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
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag172/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag173/197actualizadoal06/01/13
GitHub o Heroku?
Anoconfundir:anivelgratuito
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
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
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag176/197actualizadoal06/01/13
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.
Noolvidarsituarseenalgunacarpetadondealojemosnuestrosproyectos,y...
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag177/197actualizadoal06/01/13
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"
Ysubimosnuestroscambiosalrepositorioconfiguradopordefecto.
s@mandragora:~/demo$ git push origin master
O,sitenemosmasdeunrepositorioconfiguradoen.git/config,comogithub,especificamos herokucomodestino
s@mandragora:~/demo$ git push heroku master
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag178/197actualizadoal06/01/13
100% |==============================================| Time: 100% |==============================================| Time: 100% |==============================================| Time: 100% |==============================================| Time:
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
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
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"}
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:
Noticiasfrescas:
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:
Pagos
Revistas,gratis:
ScreenCastingsyvideosgratis
Tutorialesasistidos
Gratis
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
Entrarconcasco
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag189/197actualizadoal06/01/13
DefinirenGemfilelaentrada
gem 'devise'
AgregardevisealGemfile,lanzarbundle
bundle install
Instalarelnuevogenerador
Talcomoserecomiendaporelenvodecorreo,agregara config/environments/development.rblalinea
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
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
Significaqueunusuarioharealizadounsign_out,yporlotantosehadestruidosusesin.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag191/197actualizadoal06/01/13
Conestopodemosescribirunlogoutdelasiguienteforma:
<%= link_to "Salir", destroy_user_session_path, :method => :delete %>
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag192/197actualizadoal06/01/13
new_user_session
GET
/users/sign_in
{:controller=>"devise/sessions", : action=>"new"}
AsescomoseconstruyeelEntrardelejemplo,querecordemos,seveacomo:
<%= link_to "Entrar", new_user_session_path %>
Habilitamoslacreacindevistaspersonalizadas
rails generate devise:views
Ygeneramosvariasvistaspersonalizadasparalosusuarios
rails generate devise:views users
Otramanera,yqueporseguridadtambinpuedeactivarse,esbuscar app/views/devise/registrations/new.html.erbycomentarlalinea
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.96Betapag193/197actualizadoal06/01/13
Demodoquequedealgoascomo
<p><%#= f.submit "Sign up" %></p> Creacin de nuevos usuarios: <blink>deshabilitado</blink>
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