Professional Documents
Culture Documents
95Betapag1/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag2/197actualizadoal06/01/13
Udpodraestarleyendounacopiavieja!
Chequeelaversinenelencabezadodelashojas,contralaltimaenelsitiooficial,
http://r3uw.heroku.com
Desdeallencontrarelvnculohacialaversinmasactual,yunlistadomuytildeerratas,
correcciones,einclusounaseccindondepostearerroresysugerencias.
Estelibroestangratiscomounacerveza(freeasabeer).CuentesiempreconlaltimaversindisponibleenPDF.Mi
objetivoesquelolealamayorcantidadposibledepersonas,yquestasmeretornensusimpresiones,erroresencontrados
ysugerenciasengeneral.
Dehecho,necesitodeestosreportesparaobtenerunnivelapreciabledecalidad,talqueellibroseadignodeserllevado
aunaimprenta.
Unavezqueellibroestelisto,pretendoseguirdejndololibre,publicarloenlaeditorialBubok(impresinademanda),y
quedarmecomomuchoconu$s5deregalasporlibro...almenosparahacerlecreeramiesposaquehagodinerocon
esto.Creoquesiellibrolomerece,lagentesecansardeleerloenpantalla,yquerrtenerunejemplarenpapel.
Adems,ledarlaoportunidadaloslectoresdetenerellibroenpapel,ydeconvertirseenlaenvidiadecompaerosy
amigos.
SergioA.Alonso
[ http://ar.linkedin.com/in/alonsosergio
[ Blog: http://obelix.bunker.org.ar
[ http://about.me/elbunker
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag3/197actualizadoal06/01/13
ndice de contenido
Introduccin a la presente obra................................................................................................................................8
OS Wars Disclaimer............................................................................................................................................8
Everybody loves Screenshots..............................................................................................................................9
Por qu utilizar Ruby para escribir pginas Web?...........................................................................................10
Mas piedras preciosas....................................................................................................................................... 11
Captulo 1: Instalacin y Creacin de un Marco de Trabajo................................................................................. 13
Aclaraciones previas ........................................................................................................................................ 14
GEM............................................................................................................................................................. 14
Bases de Datos............................................................................................................................................. 14
SQLite.......................................................................................................................................................... 15
Instalacin en Ubuntu (y extensible a Debian con mnimas modificaciones).................................................. 16
Instalar GEM................................................................................................................................................ 17
MySQL bajo Linux Ubuntu......................................................................................................................... 21
Instalacin de SQLite bajo Linux Ubuntu ...................................................................................................21
Ventanas, en Linux........................................................................................................................................... 22
RDOC y RI....................................................................................................................................................... 22
Instalacin en Windows ................................................................................................................................... 24
DevKit.......................................................................................................................................................... 25
Instalacin de GEM y Rails en Windows.................................................................................................... 26
SQLite bajo Windows.................................................................................................................................. 27
MySQL bajo Windows.................................................................................................................................27
Administradores para SQLite, Windows.......................................................................................................... 29
Microsoft SQL Server.......................................................................................................................................30
Ahora si: Rails 3 en Windows...........................................................................................................................30
Comprobar todo................................................................................................................................................ 31
Editores............................................................................................................................................................. 34
[IDEs] vs [Editores simples + IRB]............................................................................................................. 34
Editores........................................................................................................................................................ 36
Vim (Windows y Linux)............................................................................................................................ 36
Sublime (Windows y Linux)...................................................................................................................... 39
RedCar (Linux y Windows)....................................................................................................................... 39
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag4/197actualizadoal06/01/13
IDEs.................................................................................................................................................................. 41
Netbeans (Linux y Windows).....................................................................................................................42
Rubymine (Linux y Windows)................................................................................................................... 43
Otras herramientas tiles.................................................................................................................................. 44
Dadme un punto de apoyo y mover el mundo
Arquimedes.................................................................................................................................................. 44
Consola / Terminal / MSDOS..................................................................................................................... 44
Windows / Linux: Firebug......................................................................................................................... 45
Windows / Linux: Web Developer............................................................................................................. 45
Captulo 2: Un poco de Ruby.................................................................................................................................47
IRB... o "el polgono de tiro"............................................................................................................................ 47
For vs Iterar.......................................................................................................................................................48
Fechas............................................................................................................................................................... 48
Arreglos............................................................................................................................................................ 49
Bloques vs For.................................................................................................................................................. 50
Diccionarios (en rigor: Hash) .......................................................................................................................... 51
Smbolos como ndices..................................................................................................................................... 51
Modelo try -- catch - finally..............................................................................................................................52
Acceso a bases de datos sin uso de ActiveRecord o Rails... todava................................................................ 53
Acceso a MySQL......................................................................................................................................... 53
Acceso a MSSQL.........................................................................................................................................53
Bindings grficos.............................................................................................................................................. 55
Mdulos............................................................................................................................................................ 57
Clases................................................................................................................................................................ 58
Herencia....................................................................................................................................................... 59
Clases temporales......................................................................................................................................... 61
Entrada por lnea de comandos......................................................................................................................... 61
Mtodos Bang!.................................................................................................................................................. 61
Captulo 3: Frameworks....................................................................................................................................... 63
Algunas caractersticas del framework Rails.................................................................................................... 63
Frameworks MVC.............................................................................................................................................64
Algo ms respecto del Modelo......................................................................................................................... 66
Captulo 4: Bienvenidos al Tren............................................................................................................................ 67
Crear una Aplicacin........................................................................................................................................ 67
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag5/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag6/197actualizadoal06/01/13
El problema................................................................................................................................................ 127
Uno a muchos => Combo SELECT, Radio Buttons....................................................................................... 129
ORM... de nuevo............................................................................................................................................. 131
Tengo muchas tablas, ndices y campos!....................................................................................................... 132
Estrategia 1.................................................................................................................................................132
Estrategia 2.................................................................................................................................................134
Captulo 11: Muchos a Muchos => Checkboxs................................................................................................... 136
Cargar departamentos.................................................................................................................................137
Creacin del ABM de proyectos..................................................................................................................... 139
Crear tabla relacin......................................................................................................................................... 140
Formalizamos la relacin entre las tablas...................................................................................................141
Controlar la relacin................................................................................................................................... 141
Ahora s: los CHECKBOX..............................................................................................................................149
Cambios en el controlador.............................................................................................................................. 150
Algo mas respecto de las vistas:..................................................................................................................... 150
Y el show? (yapa!)...................................................................................................................................151
Jugando con MVC............................................................................................................................................... 153
Mapear Rutas y Controladores........................................................................................................................154
La Vista...................................................................................................................................................... 155
El Controlador.................................................................................................................................................157
Server de Produccin...........................................................................................................................................159
Server de Produccin en Windows................................................................................................................. 162
Preparar Base..............................................................................................................................................162
Instalar Mongrel como servicio................................................................................................................. 163
Configurar Apache..................................................................................................................................... 164
Errores........................................................................................................................................................ 165
Links recomendados: .................................................................................................................................167
Server de Produccin en Linux Ubuntu.......................................................................................................... 167
VirtualHosts............................................................................................................................................... 169
Multihosting............................................................................................................................................... 172
Alojar el proyecto sobre un Cloud....................................................................................................................... 174
GitHub o Heroku?......................................................................................................................................... 174
Alojar y Compartir en Heroku........................................................................................................................ 174
Retomar o Colaborar con un proyecto alojado en Heroku.............................................................................. 177
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag7/197actualizadoal06/01/13
Ayuda!................................................................................................................................................................ 179
Debuggear en Ruby......................................................................................................................................... 179
Debuggear en Rails......................................................................................................................................... 179
Para debuggear en la vista.......................................................................................................................... 180
Para debuggear en el controlador............................................................................................................... 180
Listas de Correo.............................................................................................................................................. 182
Twitter............................................................................................................................................................. 183
Cheatsheets y RI..............................................................................................................................................184
Links Recomendados & Imperdibles...................................................................................................................186
Polgono de tiro para captulos nuevos................................................................................................................ 188
Sistema de login en rama testing de GIT........................................................................................................ 189
Tu Ruta es mi Ruta (link_to & rake routes)................................................................................................192
Su identificacin, por favor........................................................................................................................ 192
Internacionalizacin (i18n)............................................................................................................................. 194
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag8/197actualizadoal06/01/13
OS Wars Disclaimer
<antiflama mode="activado">
Otraraznporlacualheacometidolaconfeccindeestelibro,esacercaralosusuarios
deWindowsyLinuxhaciaesteframework.ParticularmentealosusuariosdeWindows,
porquetodavalescuestamuchosalirdelosentornosunificados,centralizadosyalmenos
paramiagobiantes.Ladescentralizacindelentornodetrabajoesunadelasmejores
experienciasquepuedatenerunprogramadordeespritulibre.
Mediantelosejemplos,esperoanimarlosaquepruebenRailsbajoLinux.Ladiferenciaes
mnima.Porcierto,elenfoqueapuntaausarRubyenunadistribucinabanderadapor
aquellosnovatosquerecinempiezanconelsistemaoperativodelpinginito,elamabley
confiableUbuntu.Ynoquierodejardeladoalgunasinstruccionesparasuscurtidos
administradores,quienesprobablementevayanaalojarnuestraaplicacincuandoesta
comienceatambalearsebajoelpesodelasconsultas.Esdecir,cuandosearentable.
Deliberadamente,hedejadodeladoaOS/X.Unapena,puestoquesehaerigidoenestos
ltimosaoscomolapanaceaquejuntalomejordeambosmundos.Sinembargo,nome
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag9/197actualizadoal06/01/13
sientoculpable.Sucedequeeltercermundo,dedondeprovengo,unaMaccuestael
equivalenteamedioaodesueldo.Yporotrolado,yahaymucha,ymuybuena
documentacin:lacomunidaddeestesistemaoperativohasidoquienmshaadoptado
aRails.Porsupuesto,losejemplostambinsonvlidosparaellos.
Paranollenardehojasextraselpresentevolumen,tambinhedejadodeladounsistema
operativoquemegustamucho:FreeBSD.LosesperoenmiBlog,http://obelix.bunker.org.ar,
porinquietudesalrespecto.
Esfrecuenteencontrarenlasconvencionesderubystas,enlosGoogleSummerofCode,y
otroseventos,avariosprogramadorestrabajandoenunmismoproyecto.Simiranlas
pantallasdelasnotebooks,consorpresanotaranquecadaunotrabajaenelsistema
operativoqueseleantoja.Losmantieneunidos,enprimerlugar,lafantsticaherramienta
"gems".Yensegundolugar,algnmanejadorparagestionarconcurrenciadeversiones,
comoGIT.Ambasherramientassernutilizadasfrecuentementeenlapresenteobra.
1 Amenosquedepuromalvado,ymedianteGimp,muestrecosasqueenrealidadnofuncionan...
muajajajah!
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag10/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag11/197actualizadoal06/01/13
cantidaddecosasqueseencadenancadavezquehaceclick.
Hastaestepunto,RubynodifieretantodeotroslenguajesparalaWeb.Armarunainterface
Web2.0puedetomaruntiempoapenasmenor.
Cualesladiferencia?
LadiferenciaestribaenquelosprogramadoresWeb,tardeotempranodebenaprendera
usarunframework.Programarcomportamientosenriquecidosamanopuedellegaraser
desquiciante.Losframeworks,encambio,poseenlibreras,scripts,patronesdediseo,que
seencargandelidiarconciertosaspectoscuyasparticularidadesentorpecenelplacerde
lacreacin.
YlosframeworksdeRubysonlosmsfcilesdeaprenderdelmercado.Todosellosnos
permiten(yobligan)ahacerusodestandaresdelaWeb2.0,talescomoCSS,Ajax,XML,
Json,YML,pormencionarsoloalgunas.Deestamanera,esrelativamentesimpleinteractuar
conFlex(Flash),APIsdelosprincipalesclouds,ybindingsdetodotipohaciaJava,.NETyC+
+.Tambinsellevamuybiencontodaclasedemtodosqueguardanocachean
informacin,tantodelladoservidor(SQL,NOSQL)comodelladocliente(SQLite,AIR).
Ycomositodoestofuerapoco,lasintaxisdeRubyesnatural,seleemsfcil,esoriginal,
limpia,atrevida.PorestasrazonestildanalosprogramadoresdeRubydemetrosexuales,lo
cualquizsnoestexentoderazn.
Soportamultihilos...hastaenMSDOS!
Orientadocompletamenteaobjetos.
Permiteintervenirlosobjetosentiempodeejecucin.
ParecidoenalgunosaspectosalgenialPython,peroadiferenciadeste,Rubyhasta
el2000noestabatraducidoalingls
Si,yalodije.Perolodigodenuevo:poseebindingshacia
C++
Java
.NET
Python
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag12/197actualizadoal06/01/13
Tk
Manejaexcepciones.
Escapazdedocumentarunaaplicacinconsolousarelcomandordoc.
Poseeaccesoaladocumentacininstaladadelsistema,medianteloscomandosriy
fxri.
Poseeunacomunidadmuygrandededesarrolladores,loscualestodoeltiempo
fabricanclasesyobjetosasombrosos.Parecenpersonasmuyfelicescompartindolo
todo.Loson,desdequelesconcedieronasilopoltico...cuandoarribarondesdelas
sperascostasdeJavayC++
LosprogramasdeRubycorrenconlamismasintaxisenlamayoradelossistemas
operativosconocidos.Solohayquecuidarquecuentenconlasmismaslibreras,oal
menos,libreras(gemas)portadasalsistemaoperativoqueestemosusando.Tambien
estaeslaraznporlacualRubyesptimopararealizarscriptingeinstruccionesde
deploy.
Finalmente,suportabilidadhaciavariossistemasoperativossepudeobservaren
eventostipoSummerofCodeycongresosderubystas,dondeesfrecuentever
programadoresdeRubyconectadosvaGIT/SVN,desdesusequiposconWindows,
MACOS/X,Linux,einclusodesdecelularescorriendoAndroid,coexistiendo
pacficamenteycolaborandojuntos.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag13/197actualizadoal06/01/13
Captulo1
Captulo 1: Instalacin y Creacin de un Marco de Trabajo
Entrelasmuchasdiscusionesquedividenalosprogramadores,hayunaenparticularquese
distingueporsupasin:laintegracindelentornodetrabajo.
Hayprogramadoresquesesientencmodosdentrodeentornosqueleprovean
absolutamentetodo.EntreellospodemosencontraralosusuariosdeVisualStudio,Eclipseo
NetBeans(Java).
Otrosprogramadores,encambio,prefierenladesmodularizacindelaspartes,esdecir,
componentespequeos,enloposiblelibresygratuitos.
Siadivinacorrectamente,elmundodeRubyseconstruyedesdeelsegundoenfoque.La
naturalezaylibertaddeRubyocasionaqueexistanmuchasopcionespararealizaruna
mismatarea.SibienexistenIDEsconmuchasumadepartes,talescomoEclipseAptana
StudiooRubymine,coneltiempocoincidirconmigoenqueunlivianoeditoryunas
cuantasherramientasestodoloquehacefalta.
EnestecaptuloinstalaremosRuby,unmanejadordepaquetesllamadoGEM,yatravsde
GEM,lagemaRails.Tambinlerecomendarotraspiezasdesoftwarequemehansidode
muchautilidad.
Esperoqueconellasconstruyaunmarcoagradabledetrabajo,personalizadoasugusto.
Porsiquieredarseunavuelta,esteelmo:http://www.bunker.org.ar/incubadora.varios/ruby
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag14/197actualizadoal06/01/13
Aclaraciones previas
GEM
EsimportanteaclararunaspectoqueconfundealosnovatosenRails.Esteframeworkes
unagemadeRuby.Porlotanto,debemostenerinstaladostantoRubycomoGEM.
GEMesuninteligenteinstaladordepaquetes,utilidadesylibreras.Esanlogoalgestorde
paquetesaptgetdeDebian/Ubuntu,perofuncionasobrecualquiersistemaoperativoque
estsoportadoporRuby.
Bases de Datos
CulSQLestoyusando?
Cualquiera,encualquiermomentodelastresfasesdedesarrollo.Incluso,eninstalaciones
realmentegrandes,podranousarSQL(4).
LosprogramadoresdeRubysuelenusarSQLiteparalasetapasDevelopmentyTesting,en
suspropiasmaquinasdedesarrollo,poruntemadecomodidadyahorroderecursos.
Cuandopasanaproduccin,subenlaaplicacinalservidormedianteGIT(oMercurial,
Subversion,etc)+Capistrano,ydeployansobrealgnmotormasgrande,comoMySQL,
PostgreSQL,Oracle,oMSSQL.Porsupuesto,estecomportamientonoesobligatorio,perosi
eselmasrecomendadoporlacomunidad.Igualmente,veremoscomoinstalarservidores
deproduccintantosobreWindowscomosobreUbuntuLinux.
Comohabamosmencionado,ActiveRecordseencargadelidiarconlasdiferenciasde
sintaxisSQLpropiasdecadamotor.
PrximamenteveremoscomoelcomponenteVistadeRails,elActiveRecord,buscaque
nolidiemosconlasparticularidadesdelasbasesdedatos.ComotodalibreraORM,trata
deaislarnosdelasmaneraspropiasyparticularesenque"sehacenlascosas"dentrodeun
motorSQLenparticular.
4 http://del.icio.us/karancho/nosql
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag15/197actualizadoal06/01/13
SQLite
SQLiteEsunpequeoygilmotorRDBMS,muyembebibleytransportable.Seusaen
montonesdepequeasaplicacionesyminiframeworks,usualmentedelladodelcliente,
talescomoGoogleGears,paralasversionesofflinedeGmail,CalendaryReader,oAdobe
Air,etc.
Estosloaplicanparacacheardatos,bufferizarlos,omantenerlosofflineparaposteriores
sincronizaciones.Podemosusarlocmodamentetambinenelladodelservidor,puesto
quenorequieredeundaemonniconfiguracinalguna.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag16/197actualizadoal06/01/13
Puedereemplazarruby1.8por1.9simplementecambiandoelnumero8porel9enel
nombredelospaquetes.Entrminosgenerales:
Ruby1.9esmuchomasrpidoque1.8
Sinembargo,algunasfuncionesmuy"estables"ycomprobadasen1.8nofuncionan
todavaen1.9
Finalmente,ciertasfuncionesmuyavanzadas,naturalmenteseencuentran
disponiblessoloen1.9
Sivaainstalarunservernomuyrpido,ynoquieresorpresas,utilice1.8
SinecesitamantenerbajoLinuxambasversionesensimultneo,puedeutilizarRVM
(RubyVersinManager).
ProblemasconelProxy?
EnLinuxhayunseteogeneralenelquetodaslasaplicacinsefijan,ubicadoenSistema
PreferenciasProxydelaRed.Alternativamente,puedeconfigurarCURL,elgestorde
descargasqueusanvariasdelasaplicaciones,editandoelarchivo~/.curlrcyagregando
adentrolavariableproxy.Amododeejemplo:
proxy = proxy.mendoza.gov.ar:8080
OtrosprogramascomoRVMoGEMtambinpuedentomarvaloresproxydesdelneade
comandos.Ejemplo:
gem1.8 install --http-proxy http://proxy.mendoza.gov.ar:8080 rails
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag17/197actualizadoal06/01/13
Instalar GEM
Necesitaremoslautilidadgemparainstalarvarioscomponentes.EnLinuxUbuntupodramos
realizarunainstalacindesdelosrepositorios,medianteelconocidoaptgetinstallgem.Sin
embargo,estecomponentenosiempreseencuentraactualizado.EnlacomunidadRuby
recomiendanseguirlossiguientespasos:
1. BajarlaultimaversindeGemdesde
http://rubyforge.org/projects/rubygems
2. Descomprimirelarchivoenunacarpeta
3. Ejecutar
ruby setup.rb
4. Sigemyaestinstalado,puedeactualizarlomediante
gem update --system
5. Probemosinstalandounalibreranecesaria:
gem install execjs -V
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag18/197actualizadoal06/01/13
gemogem1.8?
Anoconfundirse:enLinuxpodramoshaberinstaladoelcomandogemmedianteaptitude
oaptget.DebidoalavelocidadconlaqueocurrencambiosenlacomunidaddeRuby,
habamosmencionadolaposibilidadqueestaversinseencuentredesactualizada.
SibajamoseinstalamosGemmanualmente,desderubyforge,tendremosdosGem
instaladas.Sillamamosagem1.8,nosestaremosrefiriendoalaversinprocedentede
rubyforge,yrecomendadaparalosejemplosdeestelibro.
Enpocaspalabras:siustedllamaalcomandogemasecasenLinux,yesteresponde,es
porqueestausandolaversindelosrepositorios.Sillama,yrespondecorrectamente
gem1.8,esporqueusalarecomendadadellibro.Ambaspuedenestarinstaladasen
simultaneo,peroesrecomendadousarsolouna.
Framework Javascript
RailsnecesitadealguninterpreteJavascriptinstaladoenalgunlado.Haydosmanerasde
satisfacerletalnecesidad.
1) MedianteUbuntu:
sudo apt-get install nodejs
2) Omedianteelsistemadegemas.AgregandoalarchivoGemfileunalnea
gem 'therubyracer'
ycorriendoluego
bundle install
Obajandodirectamentelagemaalsistema
sudo gem1.8 install therubyracer
Ahorasi:Rails3
sudo gem1.8 install rails -V
Rails3instalaenformaautomticavariasdependenciaspropias,yuncomponente
llamadobundle.BundlerevisaelGemfiledecadaproyecto,ygeneraunainstalacindelas
gemasqueseencuentrenindicadasadentro.Esmuytilparacuandoagregamos
posteriormentegemasalproyecto.Sicambiamosdeequipo,bastaconcorrerdentrodel
proyecto(nohacefaltaquelohagaahora):
sudo bundle install
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag19/197actualizadoal06/01/13
Ydeestamanera,laotracomputadoratendrtambinlasgemasnecesarias.Estoesmuy
tilcuandocopiamoslaaplicacinalserverdeproduccin.Porsupuesto,shitcould
happens,peroesunaventajaenormerespectodeotrosframeworksquenotienensiquiera
pensadocomomigrartodoelproyectoentrecambiosdelibreras,odelaversindel
lenguajeusado.
Enelsiguienteejemplo,siestamosusandoRailsconunaversinmenora3.1,elpaso3es
manual.
1)
Fabricaelproyecto
2)
cd cualquiera
Entraalproyecto
3)
InstalalibrerasnecesariasparaesteproyectoRailsen
particular
Esoestodo.Podemosborrarelproyectocualquiera,yaqueposeemostodaslasgemas
necesariasenelsistemaparaempezaratrabajar.Estepequeoaprendizajeesmuytil
paracuandoconstruyaunaaplicacindependientedesabrosasgemasqueobtengaen
internet,ydeseequecuandoelproyectosubaaunserverdeproduccin,porejemplo
Heroku.UsteddeberaanotarenelarchivoGemfiletodaslasgemasquesevayabajando
deinternet,afinqueduranteelprocesodedeployremoto,Railssolicitequelesatisfagan
lasmismasgemasquetieneenlamaquinadedesarrollo.
NotaenDebian:UnodelasgemasquesuelesolicitarRails3,vaBundler,esla
correspondienteaSQLite.YestodaalgunosproblemasbajoDebian5"Lenny",sobrelacual
esposiblequedebacorreralgunaslneasextras(5).
5 EnDebian,revisesiposeelaversin5Lennyolaversin6Squeezemedianteelcomandocat/etc/lsb
release.Enelcasode6Squeeze,lospasosparainstalarRubyyRailssonbastanteaproximadosalos
Ubuntu.Encambio5LennysoloposeeRuby1.8.6enlosrepositorios,insuficientesparaRails3,demodo
quedeberaseguirlassiguientesinstrucciones:
Abracomoroot(comandosuroot)elarchivo/etc/apt/sources.listyagreguelasiguientelneaal
final:
Luegoejecute
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag20/197actualizadoal06/01/13
Unavezterminadalainstalacin,convienerevisarlaversin:
rails -v
Antesdecomenzaraprobar,decidaquetipodebasededatosdeseausar,yavanceunos
captulosparachequearlainstalacinnecesaria.
Finalmente,podrinstalarSQLitemediante
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag21/197actualizadoal06/01/13
AdministradoresOpcionalesparaMySQL:
PararevisarelestadodeMySQL,yocasionalmenteadministrarsusdatos,sepuedeinstalar
lossiguientespaquetes:
sudo apt-get install mysql-navigator
Tambinpuedebajardeinternetlaversinportabledelmagnifico
HeidiSQL(http://www.heidisql.com/)paraWindows.
ParacorrerloenLinuxsolonecesitaejecutarelarchivoheidisql.exe
anteponiendoelcomandowine.
SiextraaaphpMyadmin,puedeinstalarlofcilmentemediante
sudo apt-get install tasksel
sudo taskel install lamp-server
sudo apt-get install phpmyadmin
sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin
Luego,busqueaphpmyadminenhttp://localhost/phpmyadmin
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag22/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
Enelsiguientevnculopuedeencontrarvariasguasparadesarrollarenpocotiempo
aplicacionesenriquecidas:http://wxruby.rubyforge.org/wiki/wiki.pl?WxRuby_Tutorial
OtarsmuybuenasopcionesdisponiblesenelmercadosonTK(laopcinoficial),Shoes,y
FXRuby(soloparaWindows).
RDOC y RI
Quizsustedesdelosprogramadoresquenolesgustatrabajarenmanualesdesus
aplicaciones.Manualesqueprobablementesususuariosnoleern.Entonceslealegrar
saberqueRubyposeeuncomandollamadordoc.Alestilodejdoc,estecomando,
ejecutadoenlarazdelaaplicacin,puedecrearnosautomticamentelamayorpartede
ladocumentacin.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag23/197actualizadoal06/01/13
TambinpuedeinstalarloenDebian/Ubuntumedianteaptget.
Adems,lapresenciadeestepaqueteevitaalgunosmolestoswarningsdurantela
instalacindealgunasgemas.Alternativamente,puedeejecutar:
Adems,Rubyofreceunaayudaenpantallasobremuchasdesusfunciones.Noesque
desconfiemosdeGoogle,perori(RubyInformation)nospuededesambiguarrpidamente
lasdudas.Primero,ejecute:
Serabuenaideacomprobarsilaayudaenpantallaestfuncionando.Porejemplo,sino
recordamoslanomenclaturadelosmtodos,yqueremosverunejemplo:
ri methods
(qparasalirdellessinvocadoporri)
Estodevuelveunalistadelosmtodosaccesiblespblicamente.
class Klass
def kMethod()
end
end
k = Klass.new
k.methods[0..9]
k.methods.length
#=> 42
Porcierto,tantoricomordocpuedenserinstaladosmedianteaptget,perosiempreser
masmodernalaversinprocedentedegem.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag24/197actualizadoal06/01/13
Instalacin en Windows
ObtenemosRubydesdewww.rubyinstaller.org,proyectoargentinodelprximamente
legendario,LuisLavena.
Alltenemoslaopcindebajarnos
variasramasdedesarrollo.Entrminos
generales,yalafecha,setiembrede
2010,larama1.8esmascompatible,
entantoquela1.9esmasrpiday
proveevarioscambiosmuy
interesantesensuAPI.Retrocedahasta
loscomentariossobrelainstalacin
sobreUbuntuparavermasdetalles.
CuandocodeamosenRuby,loideales
hacerlodesdeelMSDOSconlas
variablesPATHapuntandoalacarpeta
c:\ruby<version>\bin
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag25/197actualizadoal06/01/13
SideseaactivarmanualmentelavariablePATH,lopuedehacerhaciendoclickderecho
sobreMiPc(Equipo)OpcionesAvanzadasVariablesdeEntorno.
Luegoabrauna(nueva)sesindeMSDOSyconfirmeescribiendo:
path
Sinembargo,RubyInstalleryaproveeunaccesodirectoatalefecto,quepuede
encontrarseenInicioProgramasRubyStartCommandPromptwithRuby
DevKit
Algunospasosnecesitarandeciertaslibrarasinstaladasenelsistemallamadas
DevelopmentKit.ParaellosbajamoselarchivoautoextraibleDevKittdm32x.x.x.sfx.exede
lapaginadeRubyInstaller,presenteenhttp://www.rubyinstaller.org/downloads/
Desinstalamoselcontenidoenalgunacarpeta,C:\DevKitporejemplo.
DeacuerdoalasinstruccionesdeinstalacindeDevKit,presentesen
https://github.com/oneclick/rubyinstaller/wiki/developmentkit,abrimoselMSDOS,vamos
hastalacarpetadondeseencuentraC:\DevKit,yejecutamosloscomandos
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag26/197actualizadoal06/01/13
1.
2.
3.
Esteltimopaso(3)sirveparachequearquelaslibrerashasidoinstalados(2)
correctamenteenelpathdeRuby(1),ennuestroejemplo,existenteenC:\Ruby187
Comoprimeramedida,antesdeinstalarRails,proveeremosalgunasgemasparagestionar
basesdedatos:MySQL,SQLiteyMSSQL.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag27/197actualizadoal06/01/13
EstosarchivosdebenserdescomprimidosenlacarpetabindedondehayainstaladoRuby,
ejemplo:C:\Ruby187\bin
Adems,convieneasimismoobtenerelplugindeSQLiteparaFirefoxquesedestacaunas
pginasmasadelante.
UnabuenaideaesbuscarelarchivoLIBMYSQL.DLLensucarpetadeinstalacindeMySQL,
ycopiarloenc:\ruby<version>\bin
BajoWindowsSevende64bitspuedehacerfaltaseguiralgunospasosextras.Nuestro
referentesobreRubyyWindows,LuisLavena,tieneunmuyarticuloquetrataeltema,
presenteen
http://blog.mmediasys.com/2011/07/07/installingmysqlonwindows7x64andusingruby
withit/
Avecesquerrconstatarelestadodelasbasesexistentes.Misrecomendaciones:
a) HeidiSQL,presenteenwww.
heidisql
.com
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag28/197actualizadoal06/01/13
b) Herramientasoficialespresentesenwww.mysql.org:mysqlessentialsymysql
workbench.
Finalmente:noolvideabrirlossiguientespuertosenelFirewall:80,3000,3001,3002,8000,
3306
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag29/197actualizadoal06/01/13
https://addons.mozilla.org/es-ES/firefox/downloads/latest/5817
6 EnrealidadnoestanraroquequeciertospluginsparaFirefoxofrezcanmejoresfuncionalidadesque
programasclsicos:bastasoloobservarafireftpoafirebug.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag30/197actualizadoal06/01/13
Paraconectarcontraestabasededatos,paseeunmomentopormisfavoritos:
http://delicious.com/karancho/mssql+rails
NosepreocupeporelerrorFilenotfoundlib.
Porcierto,siestecomandofalla,insistavariasveces:aveceslosservidoresseencuentran
saturados.Ahoracreamosunaaplicacincualquieraparalanzarlainstalacindegemas
quepordefectovengaconRails,concretamenteelinstaladorbundle,queactasobreel
archivoGemfile.
Paraunproyectosimple,conbasededatosSQLite:
rails new prueba
SipreferimosusarMySQL
rails new prueba --database=mysql
Esoestodo.Elproyectodeberaestarcreadoylistoparacomenzar.
Comonicocomentario,ysiprestaatencin,durantelacreacindelproyecto,seha
disparadounscriptllamadobundle,queseencargaunpocoalamaneradeMaven,de
bajarlaslibreriasnecesariasparaqueelproyectofuncione.Siusteddebieraincluiralguna
libreraextra,debehacerlodentrodelarchivoGemfile.
Ejemplo:sihubiramossolicitadosoportedeMySQL,probablementeenGemfilefigureuna
lnea:
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag31/197actualizadoal06/01/13
gem 'mysql2'
Luegoqueesearchivoesalterado,sedebecorrermanualmente:
bundle install
SihemosescogidoMySQL,debemoseditarloscampospasswordde
config/database.yml,antesquecomencemosconlasmigraciones.
Unavezterminadalaejecucindebundle,reviselaversininstalada:
rails -v
Comprobar todo
Inclusounatecnologatanfiablecomolaaqupresentada,puedefallarenWindows,un
sistemaoperativoqueavecessuelecomportarsecomouncampominadopara
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag32/197actualizadoal06/01/13
programadores.
Paraevitarfuturosproblemas,prueberealizarlassiguientesaccionesenlarazdela
aplicacin:
rails generate scaffold Student name:string age:integer registered:boolean
rake db:create:all
rake db:migrate
rails server
Luego,carguelasdirecciones:
http://localhost:3000/rails/info/properties
http://localhost:3000/students
Sialgofalladurantealgnpaso:
Asegresedehaberintentadovariasveceslamismalnea.GEMnoproveealafecha
ensucapadeaplicacin,opcionesparadecidirsobreunexcesodecargaenel
repositoriorubygems.org.
CuidadocuandocopieypeguedesdelaversindeestelibroenPDF.Aveces
caracteresenunformatosepeganbinariamentedeotraformaeneldestino.Porsi
acaso:transcribapalabraapalabralasrdenesaquexpuestas.Ademsesbueno
paralamemoria.
SiusaMySQL,cadavezquecambielacontraseaenconfig/database.yml,reinicie
Webrick(laordenrailsserver)medianteCtrl+C.
Sipersisteelmismomensajedeerror,entoncesserelmomentoderevisarinformesde
ltimomomentoen
http://guides.rails.info
YlosrecomendadosdeLuisLavena,elgeniocreadordeRubyInstaller:
http://github.com/oneclick/rubyinstaller/wiki/Tutorials
http://pragmaticstudio.com/blog/2010/9/23/installrailsrubywindows
http://skim.la/2010/08/21/rails3rconwindowsusingrubyinstaller192/
Porsupuesto,nodejeacudiraalgunasdelasexcelenteslistasdecorreos
Enespaol:
http://lists.simplelogica.net/mailman/listinfo/rores
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag33/197actualizadoal06/01/13
http://lista.rubyargentina.com.ar/listinfo.cgi/rubyrubyargentina.com.ar
http://librelist.com/browser/rubyenviarcorreoarubysur@librelist.comyesperar
Reply
https://groups.google.com/forum/?fromgroups#!forum/mendozarb
Eninglesycomocuriosidad,parachicas!http://railsgirls.com
Finalmente,puedemantenerseactualizadoacudiendoamisvnculosbookmarkeadosen
http://del.icio.us/karancho/rails3
http://del.icio.us/karancho/rails
http://del.icio.us/karancho/ruby
http://del.icio.us/karancho/tutoriales
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag34/197actualizadoal06/01/13
Editores
[IDEs] vs [Editores simples + IRB]
CoincidotantoconFabioAkita,comoconMichaelHartl,enquelosgrandesIDEsparaRuby
molestanmasdeloqueayudan(7).SiustedprovienedeJavao.NET,inmediatamente
buscarautocompletado,instrospeccin,yvariasfuncionesquebajoRubynotienen
muchautilidad.
Laraznseencuentraenquelamayoradelasfuncionesquenecesite,yaestnincluidas
enlalibrerabase.Ynosonmuchas.Alcabodeunashoras,notarquetodoeltiempoha
estadollamandoalosmismosmtodos.
Loidealesutilizar"lospolgonosdetiro":irbparaRuby,yrailsconsoleparaRails.Enellos
puedeprobarpequeostrozosdecdigo,yluegopegarlosenalgneditorsimple.
Supongamosquequeremosaveriguartodasaquellascosasquepodemoshacerleauna
cadena.Vamosprimeroaconsultaralirb
gnome-terminal, o mejor an: terminator
Inicio Programas Ruby Start Command Prompt with Ruby
Luego,llamamosairb
irb
irb(main):001:0> p = "pepe"
=> "pepe"
Averiguamosquepodemoshacerconp:
irb(main):002:0> p.methods
=> ["upcase!", "zip", "find_index", "between?", "to_f", "minmax", "lines", "sub", "methods",
"send", "replace", "empty?", "group_by", "squeeze", "crypt", "gsub!", "taint", "to_enum",
"instance_variable_defined?", "match", "downcase!", "take", "find_all", "min_by", "bytes",
"entries", "gsub", "singleton_methods", "instance_eval", "to_str", "first", "chop!", "enum_for",
"intern", "nil?", "succ", "capitalize!", "take_while", "select", "max_by", "chars", "tr!",
"protected_methods", "instance_exec", "sort", "chop", "tainted?", "dump", "include?", "untaint",
"each_slice", "instance_of?", "chomp!", "swapcase!", "drop", "equal?", "reject", "hex",
"minmax_by", "sum", "hash", "private_methods", "all?", "tr_s!", "sort_by", "chomp", "upcase",
"start_with?", "unpack", "succ!", "enum_slice", "kind_of?", "strip!", "freeze", "drop_while",
"eql?", "next", "collect", "oct", "id", "slice", "casecmp", "grep", "strip", "any?", "delete!",
"public_methods", "end_with?", "downcase", "%", "is_a?", "scan", "lstrip!", "each_cons", "cycle",
http://www.akitaonrails.com/2009/01/13/thebestenvironmentforrailsonwindows
http://railstutorial.org/book#sec:development_tools
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag35/197actualizadoal06/01/13
"map", "member?", "tap", "type", "*", "split", "insert", "each_with_index", "+", "count", "lstrip",
"one?", "squeeze!", "instance_variables", "__id__", "frozen?", "capitalize", "next!", "each_line",
"rstrip!", "to_a", "enum_cons", "ljust", "respond_to?", "upto", "display", "each", "inject", "tr",
"method", "slice!", "class", "reverse", "length", "enum_with_index", "rpartition", "rstrip", "<=>",
"none?", "instance_variable_get", "find", "==", "swapcase", "__send__", "===", "min", "each_byte",
"extend", "to_s", "rjust", "index", ">=", "size", "reduce", "tr_s", "<=", "clone", "reverse_each",
"to_sym", "bytesize", "=~", "instance_variable_set", "<", "detect", "max", "each_char", ">",
"to_i", "center", "inspect", "[]", "reverse!", "rindex", "partition", "delete", "[]=", "concat",
"sub!", "dup", "object_id", "<<"]
Vaya,asquepodemosCapitalizarlaprimerletra?
irb(main):003:0> p.capitalize!
=> "Pepe"
Ahoras,sabiendoqueesasporcionesdecdigosonseguras,nosvamosaalgneditory
pegamosesalnea.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag36/197actualizadoal06/01/13
Editores
Seofrecenaqueditoresquepueden,ensumayora,encontrarseconversionesparalostres
sistemasoperativosmasusados,Linux,MacOS/XyWindows.
Vimdebeserunodelosmejoresymasusadoseditoresenlahistoriadelaprogramacin.Sin
embargo,requiereantesdeserusado,buscaralgnbrevetutorialenInternet.Esdecir,no
esaptoparaimpacientes.Adems,alsermuyliviano,eselpreferidodelossysadmins,
quieneslousanamenudocuandoseconectanremotosalservidorvaconexionesssh,
limpio,sinbarrasnibotones,ymuyextensible.QuienseacostumbraaVim,tiendeaverlos
demsIDEcomosifuerantravestisllenosderopaencima.Portalrazneselidealparalos
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag37/197actualizadoal06/01/13
codemonkeys,geeks,aspirantesahackers,dueosdemaquinaslimitadas,osimplemente
autodidactas.
Vimpuedeserllamadodesdeconsola/msdosmedianteelcomandovim(austero,rpido,
sinmen),ocomogvim(conbarradeiconos,mas"amable").
Vim en Windows
Descargabledesdewww.vim.org.Enelasistentedeinstalacin,recuerdeactivarlaopcin
Full,afindepoderlanzarlodesdeelpropioMSDOS.
LoprimeroquedesagradaalosusuariosdeVimparaWindowseslamodalidadInsercin:
sedebepresionar[i] paracomenzaraintroducirtexto.Paraevitarestamodalidad,se
sugierelanzarvimmedianteeliconoVimEasy
Selollamadesdeterminalcomo"gvim"ocomo"vim".
Ayuda!
Aqulesdejounaseriedevnculosparadominarestemagnficoeditor:
http://delicious.com/karancho/vim+tutoriales
Adems,unatarjetadereferenciarpidaquepuedeserestampadaenunataza
http://bunker.org.ar/incubadora
(LavendduranteuntiempoenMercadolibreconciertoxito,hastaquedecidliberarla).
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag38/197actualizadoal06/01/13
grandes,talescomoautocompletado,folding,coloreodesintaxis,etc.Paraactivarletodas
lasopciones,revisarlassiguientesnotas:
http://bunkerblog.blogspot.com/search/label/vim
Parainstalarlohacefaltarcumplirunospasos:
vim-rails
Parausarlo,selodebeejecutarsobrelarazdelaaplicacin.Porejemplo:
/home/sergio/ProyectoRails $ vimmate
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag39/197actualizadoal06/01/13
MichaelHart,elautordelexcelenteRubyonRailsTutorial(www.railstutorial.com)
recomiendauneditorparaaquellosusuariosdeWindowsquenodeseenlidiarconel"Unix
Style"deVim.SetratadeSublimeText(www.sublimetext.com),uneditormuyagradable,
queprometemucho.Noposeetodavaautocompletado,peromuchossnippetsalestilode
Texmate(Mac).
Sibiensoloselodebedescomprimirycomenzarausar,Michaelhaescritouninteresante
tutorialparahacerlomasuserfriendyen
https://github.com/mhartl/rails_tutorial_sublime_text
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag40/197actualizadoal06/01/13
traemasthemesoscuros.Lasinstruccionesparainstalarlopuedenencontrarseen
http://wiki.github.com/danlucraft/redcar/installation
lascuales,encuentasresumidas,secomponendelassiguientesinstrucciones:
sudo apt-get
install libzip-ruby1.8
Elinstaladornofabricaunaentradaenelmen,demodoquetendremosquehacerlo
nosotros,ollamarlosimplementedesdelaterminal,paradosenlarazdelproyecto,
mediante
redcar . (si,conelpuntoallado:significacarpetaactual)
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag41/197actualizadoal06/01/13
IDEs
Hastaahoravenamoscomentandosimpleseditores.Acontinuacinsepresentanentornos
mascompletos,capacesdegestionarservidores,debuggearyasistiraprogramadoresmas
experimentados.Noserecomiendasuusoalosnovatos,yaqueretrasaranintilmenteel
aprendizajeinicialdeRuby.
AptanaStudio(LinuxyWindows)
LosfanticosdeEclipsesealegrarndeconoceresteforkparaRuby.Dehecho,se
encuentraamediocaminoentreuneditoryunIDE,yaqueposeevariacaractersticas
interesantes.
Paraempezar,proveesoporteparalenguajescomo:PHP,Python,Ruby,CSS,Ajax,HTMLy
AdobeAIR.Adems,tienelaposibilidaddeincluircomplementosparanuevoslenguajesy
funcionalidades.Compatibleconaproximadamente1000extensiones.Asaber:
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag42/197actualizadoal06/01/13
DebugintegradoconFirefox,comodetalleinteresante,yaqueRubytraeun
debuggerpropio,quepuedeustedconsultarenelApndiceA.
AsistentedecdigoparaHTMLyJavascript.
LibrerasAjax(jQuery,Prototype,Scriptaculous,ExtJS,Dojo,YUIySpryentreotras).
ConexinvaFTP,SFTP,FTPS,ysnippetsparaHeroku,muytilparaagilizardeploys.
IDEparaGITintegrado,sielprogramadetectaungitinit.oungitcloneprevio.
Impresionantecoleccindesnippetspararealizartareascomunes(vercaptura).
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag43/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag44/197actualizadoal06/01/13
Enlacapturapuedeobservarseunaedicindelasvistas(vim),unespacioenelquese
esttesteando(raketest:units),unaporcinquevuelcaloslogsdelserver(mediantetailf),
ylaconsoladeRails(railsconsole)probandotrozosdecdigo.
Exterminatorsepuedeobtenerdirectamentedesdelosrepositorios,mediante
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag45/197actualizadoal06/01/13
EnWindows,puestoquevaapasar
bastantetiempoconlanarizenel
SmbolodeSistema,o"MSDOS",sera
convenientequeobtengaunreemplazo
mascmodo,ubicadoen
http://sourceforge.net/projects/console/
FirebugesunpluginparaFirefoxquepermiteexaminarlaspginasquevamosrecibiendo
enelnavegador.Sialgonoandabieneneldiseo,simplementepulsamosF12,yel
navegadornospermitirrevisarfcilmentezonas<div>,etiquetas,sucorrespondenciaen
lasplantillaCSS,susenlacesjavascript,etc.Presenteenhttps://addons.mozilla.org/en
US/firefox/addon/1843
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag46/197actualizadoal06/01/13
XHTML(8),permiteinterveniraligualqueFirebugeneldiseodelapgina,inspeccionar
diseosajenos,obtenerinformacinvaliosa,einclusocambiarlasCSSentiempode
ejecucin.Estoesmuytilparaprobaryafinardetallesdurantelosmaquetados.
8 http://www.trazosweb.com/2009/09/16/comoconvertirunpsdaxhtmlycss/
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag47/197actualizadoal06/01/13
Captulo2
Losbuenosprogramadoressepasanlavidaprogramando.
Losexcelentesprogramadores,sabenquecopiaryquepegar.
EricRaymond
Paralosejemplosaquvertidos,cualquierRubyconversinigualosuperiora1.8.7debera
bastar.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag48/197actualizadoal06/01/13
3.times do
puts "holas "
end
holas
holas
holas
[3,1,7,0].sort.reverse
=> [7, 3, 1, 0]
For vs Iterar
for i in 1973..2008
puts i
end
1973
...
2008
1973.upto(2008) do | anio |
puts anio
break if anio == 2007
end
1973
...
2007
Fechas
require 'date'
=> true
LlamamosycargamosunMdulodelalibrerabase.Losmdulossoncoleccionesde
mtodos,quenorequierendeinstanciacin.
Time::now.year
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag49/197actualizadoal06/01/13
=> 2007
sergio = Date.new(1973,2,26)
Time::now.year - sergio.year
=> 34
for i in sergio.year..2008
puts i
end
1973 .......... 2008
cristian = Date.new(1973,10,26)
cristian - sergio
=> Rational(242, 1)
cristian.month - sergio.month
=> 8
Arreglos
Nota:siobservaelejemplo,notarquelosarregloso"arrays"puedencontenertodaclase
deelementos:cadenas,enteros,objetos,otrosarreglos...
arreglo=["1",2,0.3],[4,5,6]
=> [["1", 2, 0.3], [4, 5, 6]]
Esdecir
arreglo
Columna 0
Columna 1
Columna 2
Fila 0
"1"
0,3
Fila 1
arreglo[1][1]
=> 5
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag50/197actualizadoal06/01/13
Bloques vs For
lenguajes = ['Python', 'Java', 'Ruby']
lenguajes.each do |lenguaje|
puts 'Me gusta ' + lenguaje + '!'
end
=> Me gusta Python
=> Me gusta Java
=> Me gusta Ruby
for i in lenguajes
puts "me gusta " + i
end
=> Me gusta Python
=> Me gusta Java
=> Me gusta Ruby
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag51/197actualizadoal06/01/13
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.95Betapag52/197actualizadoal06/01/13
contenido.
Creamosunhash
persona = Hash.new
Lollenamos
persona[:nombre] = 'Pedro'
persona[:apellido] = 'Picapiedra'
Otambincreamosyllenamosenunsolopaso:
persona = {:nombre => 'Pedro', :apellido => 'Picapiedra'}
Volcamosalgunosdevaloresalmacenados
puts persona[:nombre]
=> Pedro
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag53/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.95Betapag54/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag55/197actualizadoal06/01/13
Bindings grficos
SepuedeprogramarventanasenRuby?Porsupuesto:Rubypuedeutilizardiversostoolkits
grficos:
Tk
QT
wxRuby
CocoaRuby(ObjetiveC,paraMac)
GTK
Shoes
Unodelosbindingsmasavanzados,estables,multiplataformaymejordocumentada,es
wxRuby.Solorequieretenerlaslibreraswxrubyinstaladas:verseccindeinstalacin.
Veamosunejemplo:
Primero:dondeestninstaladaslasgemas?loconsultocon:
gem environment
Elcualanunciarquelasgemasseencuentraninstaladasenalgoparecidoa
/usr/lib/ruby/gems/1.8/gems
Sientramosaestacarpeta,ymiramosunpocomasadentro,encontraremosunacarpeta
wxruby-2.0.0-x86-linux
Convariosejemplosadentro:
/samples/
Paraprobarlosejemplos,concdigofuenteytodo,accedemosalacarpetamediante
ConsolaoMSDOS,ycorremos:
ruby bigdemo/bigdemo.rb
ruby bigdemo\bigdemo.rb
Aquseabrirnunaseriedeejemplosmuybiendocumentados.Podemosejecutarestos
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag56/197actualizadoal06/01/13
ejemplos,copiaryadaptarelcdigofuentedelosprogramasanuestrogusto.
Curiosidad:observarcomowxRubyimplementaloselementospropiosdecadasistema
operativo,accediendodirectamentealaAPI
DentrodelacategoraCommonsDialogs,sepuedeobservarloselementos
wxColourDialog
wxFileDialog
Windows
Linux
YenOSX?Niidea,necesitaraunacomputadoraMac.Porsideseansaberlo...mi
cumpleaosesel26defebrero.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag57/197actualizadoal06/01/13
Mdulos
Definicin:Mdulo:coleccindemtodos,quenorequierendeinstanciacin.Lohabamos
usadoenelejemplo
irb
Time::now.year
Sepuedecrearmdulos?Porsupuesto!Cumplenlafuncindelasfuncionesenla
programacinestructurada.
#creamos un vector con cadenas
claves = ['python', 'java', 'ruby']
#solo por curiosidad, le agregamos un elemento
claves.push('eiffel')
def encriptar(v)
#solo por curiosidad, ordenamos el vector enviado
v.sort
#creamos un nuevo vector
vv = []
#Representamos cada (each) elemento del vector con la variable i
v.each do |i|
#Ponemos el elemento en Mayscula al principio
i = i.capitalize
#Lo damos vuelta
i = i.reverse
#Lo agregamos al vector nuevo
vv.push i
end
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag58/197actualizadoal06/01/13
return vv
end
#Probemos como qued el mdulo:
claves_encriptadas = encriptar(claves)
puts claves_encriptadas
Respuesta:
=> nohtyP
=> avaJ
=> ybuR
=> leffiE
Clases
Ejemplificarelusodeclases,medianteunjuegoRPG.Elsiguienteprogramaguardeloen
unarchivollamadojuego.rb,yejecuteloconelcomandoruby:
class Personaje
#Atributos accesores (getters y setters pero con estilo)
#attr_reader
#attr_writer
#attr_accesor
attr_reader :nombre, :fuerza, :magia
@nombre
@clase
@fuerza
@magia
#constructor
def initialize(n,c,f,m)
@nombre = n
@clase = c
@fuerza = f
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag59/197actualizadoal06/01/13
@magia = m
end
end
class Juego
def initialize(p1,p2)
@personaje1 = p1
@personaje2 = p2
end
def combate
if (@personaje1.fuerza + @personaje1.magia) <
@personaje2.magia)
(@personaje2.fuerza +
Herencia
Laherenciaesmuysimple.Utilizaeloperador<
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag60/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag61/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.95Betapag62/197actualizadoal06/01/13
Encambiocon!
mensaje = 'Die die, piggy, die die!'
copia = mensaje.upcase!
puts mensaje
>> DIE DIE, PIGGY, DIE DIE!
puts copia
>> DIE DIE, PIGGY, DIE DIE!
<-------------------- (!)
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag63/197actualizadoal06/01/13
Captulo3
Captulo 3: Frameworks
Habamoshabladodurantelaintroduccin,respectodelaconvenienciadeutilizar
frameworksparaconstruir,masquepaginaswebdinmicas,aplicacionesWeb2.0.
Sihacemosunresumendetodomisermninicial,unframeworkesunsoftwarequeayudaa
construirotrossoftwares.
Enmaspalabras,esungranaplicacinincompleta,queseconfigurayconectansus
partes.Ysiempreobligaaseguirbuenaspracticasdeconstruccindesoftware.
Tpicamente,unframeworkpuedeincluirsoportedeprogramas,bibliotecasyunlenguaje
descripting,entreotrossoftwares,paraayudaradesarrollaryunirlosdiferentes
componentesdeunproyecto.
Proveesalidaso"vistas"nosoloenHTML:tambingeneraJSyXML.Estoesmuytil
cuandoquienentraanuestraaplicacinnoesunapersona,sinootraaplicacin.
Ejemplo:formulariosFlashconstruidosenMXMLmedianteelsimpticoFlexBuilder.
Poseeuninteligentemapeodeclasesmediante"Migraciones".Lasmigraciones
permitenmanteneractualizadounarchivo,elschema.rb,queutilizaRailscomo
mapaparaaccederalastablas.
SeadscribeaunmovimientodenominadoDRYNoRepitas(Don'tRepeatYourself).
Porejemplo,sienelmodelodeclaramosque"elcamponombrenopuedeestar
repetido",estoimpedir(ygenerarlavalidacinpornosotros)larepitenciadel
nombredesdecualquierformulario,seaesteunnew,unedit,etc.
Railstodoeltiemporealizaanotacionesdebitcora,ologgingdetransacciones,
paraverquepuedeestarfuncionandomal.
Unaspectointeresante,esqueparaevitarlaslargasconfiguraciones,mapeos
manualesdeclases,tablasendicesquemareanatodoslosprincipiantesdeStruts,
Springyotrosframeworks,Railsprefiereconveniro"acordar"primero.Estosellama
"ConvencinsobreConfiguracin".Esdecir,sirespetamoslosnombresqueusarails
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag64/197actualizadoal06/01/13
parasustablas(plural),clases(ensingular),ndices(soloid),ndicesajenos(_id),etc,
lrealizarunmontndetrabajoautomticopornosotros.
ConRailsesfcilparametrizarURLfcilesderecordar,alestilo:
http://localhost:3000/tabla/edit/2
http://libros.com/revisiones/list/20120811
Compaginacin:Railsmanejademaneramuylimpiayeleganteeldiseogeneral,a
travsdelayouts,loscualesveremosmasadelante.Adisframes,plantillas
Dreamweaverycosasraras!
TodoeltiempoRailsgestionainstanciasdeDesarrollo,PruebayProduccin,incluso
enelmismoservidor.
Frameworks MVC
Unclsicoproblemadelaprogramacindepaginasdinmicaseslamezclaentrela
lgica,lasconexiones,elSQL,lapresentacin,elmanejodelassesiones,etc.
Elcdigoresultanteesconfuso,difcildeleer,eincluso,deexplicar.Inclusocuandoel
cdigoespropio,alcabodeunosmeses,masdeunprogramadorsearrancaloscabellos,
mientraspiensa
"Quetenaenlacabezacuandoescribesto...?
Enlos80seideunmtodoparasepararlaspartesesencialesdelaaplicacin,llamado
MVC,correspondienteaModeloVistaControlador.
UsenonoRails,quizslomasimportantequesellevarandeestalectura,eslanocinde
MVC.Muchosframeworksposeensus
propiasimplementaciones.Por
mencionaralgunos:
Java:J2EE,Struts,Swing,...
Python:Django,TurboGears,...
PHP:QCodo,Smarty,phpMVC,
Trax,Symfony,
ASP.NET,WindowsForm,
Lagrandiferencia,esquelos
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag65/197actualizadoal06/01/13
programadoresdeRailsseacordaronqueMVCdebasersimple.
Veamosunejemplobsico
Navegador
Solicitud (URL)
routes.rb dice: /companies/4/show
Controlador de companies
Accin 1: new
Accin 2: show
@company = Company.find(4)
SWF
Flex
HTML
CSS
JS
XML
Json
YML
Modelo
(ActiveRecord)
Vista de Accin 1
<%= @company.name %>
<%= @company.cuit %>
De preferencia... no
SQL / NOSQL
1) Enelnavegadorsehaceclickenlacompaa#4,actionshow
2) routes.rbdescomponelasolicitud,ydecidecontrolador/accinarealizar.Eneste
caso,companies/show.LaURLpuedeincluirotrosdatostiles,talescomoel#id
3) Enlaaccinsetomanladecisiones,talescomolaconvenienciaonodebuscarla
informacinsolicitada.
Lapeticindedatosserealizaalmodelo,medianteinstruccionesdetipoORM
(ObjectRelationalMap).RailsproveeunodelosmejoresORM,llamadoActiveRecord.
Ejemplo:
@company = Company.find(4)
Desdeelcontroladorsepodrapediralmodeloqueseleproporcionenotrascosas
queActiveRecordnorealizeautomticamente.Ejemplo:
@morosos = Company.buscar_activas
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag66/197actualizadoal06/01/13
Porsupuesto,enesecaso,hayqueaclararelmtodobuscar_activasenelmodelo
Company.
Lasaccionessuelentenervistasasociadas.Enesteejemplo:show.html.erb
4) Enelmodelohayrutinasfindcapacesdeencontrarloquenecesitamos.
ActiveRecordhacetodoloposibleparaencargarsedelaparte"dura",esdecir
inyectarcomplejasinstruccionesSQL(oinclusoNOSQL).
5) Laideadelavistaesmantenerlalimpiaparaconcentrarseeneldiseo.Masdeun
diseadorpuedeespantarsecuandolepedimosquemodifiqueunapaginaescrita
enPHP,ynodejadetenerrazn.Lasdecisionesquedanparaelcontrolador.Las
bsquedas,paraelmodelo.
Porcierto,podemosemitirdatosnosoloenelconvencionalHTML,sinotambinen
textoplano,JSON,YML,oXML.Otrascapasytecnologas,talescomoFlexoAIR
puedenaprovecharestasfunciones.
MientrasqueenMySQL,lamismaconsulta,serepresentacomo
SELECT * FROM companies WHERE active = true;
Enunproyecto,cambiaramitaddeldesarrollodemotorSQLpuedeserunasolicitudmuy
cruel(9).Rails,medianteActiveRecord,semantieneporencimadeesasnecesidadesynos
abstraedelosdetalles:
Company.where(:active => true)
Aunquesinecesitamosalgomuyespecfico,estamosapurados,siemprepodemospasar
9 http://picandocodigo.net/2009/videohugadeveloperabrazaaundesarrollador
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag67/197actualizadoal06/01/13
porcionespersonalizadasaActiveRecord:
Company.where(" active = 't' ")
Captulo4
Captulo 4: Bienvenidos al Tren
Enestaparteintentaremosrealizar,pasoapaso,unaaplicacinconRails.
Porelcamino,seharusodealgunasgemasytrucospropiosdeesteframework.Los
ejemplosaparecenenWindowssoloparahacerlesperderelmiedoalosusuariosdeeste
SO,alavezquesedemostrarlaslevesdiferenciasdetrabajarconLinux.
Estaordenfabricaelesqueletodela
aplicacinRails.Ademas,
preconfiguraelentornoparatrabajar
conunabasededatosllamada
SQLite.
Sideseamosencambiotrabajarconotrasbasededatos,talcomoMySQL,Oracle,
PostgreSQL,IBMDB2,etc,podemospreconfiguraralgunosarchivosescribiendo,porejemplo
rails new demo --database=mysql
Mediantealgneditor,abralosarchivosdelacarpetademo,yobservelascarpetas
generadas.Tambinobserveatentamentelasbasesdefinidasenconfig/databases.yml.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag68/197actualizadoal06/01/13
Volveremosaestosarchivosmasadelante.ParacorrerelserverWebdepruebas:
cd demo
rails server
rails server
Estecomandocorreunpequeoserverweb,escritoenRuby,pararealizarpruebas.
Cargueladireccinhttp://localhost:3000enelnavegador.
Siobtieneunerror,cambielapalabralocalhostpor127.0.01,oreviseatentamentelospasos
enelCaptulo1:Instalacin.
Vuelvaalaconsola/MSDOS,yobservelasalidadelcomandorailsserver.Estemuestra
muchainformacinrespectodeltrficosolicitadoporelnavegador:
rails server
=> Booting WEBrick
=> Rails 3.0.0.beta application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-03-02 15:24:01] INFO
WEBrick 1.3.1
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag69/197actualizadoal06/01/13
Recarguelapagina,cambiandoladireccinporhttp://localhost:3000/zaraza
Observeelerrorgenerado,tantoenelnavegadorcomoenlasalidadelserverWeb.
Truco:unaspectocasiescondidodeestabienvenida,eslaposibilidadderevisarsilas
gemasinstaladassatisfacenalaaplicacin.Esimportantehacerclicksobre
Aboutyourapplicationsenvironment
(http://127.0.0.1:3000/rails/info/properties)
Siestoocasionaunerror:
We'resorry,butsomethingwentwrong
Significaque,porrazonesdeseguridad,Railsseniegaamostrarelerror.Paraverqueeslo
quelefalta,debemosrevisarlatrazadelcomandorailsserver.
Webrick,porcierto,esunpequeoserverparahacerpruebassimples.Cuandocorraen
modoproduccin,seguramenteutilizarApacheoMongrel.Sinecesitamaspotenciade
respuestaenmododevelopment,puedeiniciarmongrelenlugardewebrick,desplegando
elserverdelasiguientemanera.
Yluego
rails server mongrel
otambin
rackup --server mongrel --port 3000
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag70/197actualizadoal06/01/13
Instalacin de GIT
Bajo Linux
BajoLinuxUbuntu,instalaremosGITenmodoconsola,yenelmismopaso,variascmodas
interfacesgrficas,medianteunsimple(10)
10 Nuevamente,sideseaprofundizarenelusodeaptget/aptitude,bajeunacopiagratuitadelManualde
RedesLibres,escritotambinporquienleescribeahora,ydescargabledesde
http://www.bunker.org.ar/incubadora/redes.pdf.Elcaptuloquetrataelusodeaptgetes"Instalando
binariosdesdelasfuentes".
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag71/197actualizadoal06/01/13
sudo apt-get install git-arch git-gui gitk tig qgit giggle meld
Bajo Windows
GIThasidoportadodediversasformasaWindows.Lamayoradelosusuariosqueutilizan
GITbajoelsistemaoperativodelasventanitas,coincidenenquelamejorimplementacin
eslarealizadaporMsysGIT,lacualpuedeobtenerseenhttp://code.google.com/p/msysgit/
Lainstalacinesmuysencilla,ycomonicocomentario,deberamencionarla
convenienciadeactivarlassiguientesopcionesdurantelainstalacin:
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag72/197actualizadoal06/01/13
comoprogramadoresconexperiencia.
Siamedidaqueprogresaenlaconstruccindelosejemplosdellibro,seencuentracon
errores,otienedudasrespectodecomodeberaverselaaplicacinfinal,recuerdeque
puedecrearunacarpetaencualquierparte,ydentrodeellabajarmiversindela
aplicacin,mediantelaorden
Recordemos:
Medianteelcomandorailsnewdemohabamoscreadoelesqueletodela
aplicacin.
Habamosentradoalacarpetamediantecddemo
Habamoslevantadounserverdepruebas,conelcomandorailsserver
Enesteultimopaso,laconsola/MSDOSqueda"capturada",esdecir,nonosdeja
escribirotracosaqueCtrl+C(interrumpir),alavezquemuestralasconsultasdelos
navegadores.
Abrimosotraconsola/MSDOS,entramosnuevamentealaaplicacinmediantecddemo,y
creamosunrepositoriolocal:
cd demo
git init
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag73/197actualizadoal06/01/13
Eltrmino"local"serefiereaquepodemosgestionartantorepositorioslocalescomo
remotos.
Configuramoselrepositorioconalgunasvariablestiles.
s@mandragora:~/demo$ git config --global user.name "Sergio Alonso"
s@mandragora:~/demo$ git config --global user.email "sergio@eim.esc.edu.ar"
s@mandragora:~/demo$ git config --global color.ui "auto"
Agregamostodoslosarchivosdelproyecto,yrealizamoselprimercommit,omaltraducido
"entrega".
git add .
git commit -a -m "Agregados los archivos del proyecto"
Created initial commit 073c820: - Agregados los archivos del proyecto
128 files changed, 15218 insertions(+), 0 deletions(-)
Enlalneagitcommit,GITinvocara
algneditorparaquecontemosque
cambioshemosrealizado.Se
recomiendaenfticamenteutilizaresta
funcincomoundiariopersonal.
EleditorpreferidodeGITesvim.Caso
contrariobuscaralgnotropresente
enelsistema,comonano,mceditu
otro.
Enelcasodenano,unavezqueterminamosdedescribirnuestrasaventuras,
pulsamosCtrl+Xparasaliryguardar.
Enelcasodevim,anoasustarsesinoscuestaoperarlo.Solodebemospulsarlatecla
deinsercindetexto(i).Escribimosloquesenosantoje,yvolvemosalmodo
comandoconEsc.Lasecuencia:wqgrabar(write)loscambios,ysaldr(quit)al
sistema.
Convengamosquevimnoesmuyamigableensuprimeraimpresin.Tampocoenla
segunda,perosuusoesmuyaceptadoentodalacomunidad,debidoadiversas
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag74/197actualizadoal06/01/13
caractersticasquelohacenprobablementeelmejoreditorenlahistoria(11).Poresta
raznexistencientosdetutorialeseninternetparaoperarestemagnficoeditor.Pase
porelapartadodeEditoresparavermasayudasobreelmismo.
Paramasinformacinsobreelmodoquirks,lealapagina60delmagnificolibrogratuito
IntroduccinaCSSdeJavierEguluzPrez,quepuedeencontrarseenlibrosweb.es
Ahora,estandoparadosenlarazdelaaplicacin,agregamosestearchivoalmecanismo
deseguimientodeGITmediante
git add public/bienvenida.html
Nota:tambinpodemosagregararchivossinespecificarsuruta,mediante
git add .
11 Si,si.Juntoaemacs,porsupuesto.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag75/197actualizadoal06/01/13
Nota:convenienciadeusargitadd.
Elcomandogitaddsepuedeutilizaracompaadodeunarchivoenparticularalcual
queremosqueGITtrackee(persiga,rastree),osimplementeacompaadodeun.(punto)
final,enelcualGITrevisatodoelrbolenbuscadeagregados,modificadosoborrados.
Elcomandogitadd.esmuycmodocuandohemosrealizadomuchoscambios.Tantos,
quenorecordamoscuantosarchivoshemosinvolucrado.Perodebemostenerencuenta
quequizsagreguecosasquenodebera,talescomobasesgrandes,oarchivoscon
contraseasimportantes.
Paraevitarquegitadd.tomeencuentaciertosarchivos,creamosunarchivoenlarazdel
proyectoconnombre
.gitignore
cuyocontenidosea,porejemplo
db/production.sqlite3
Rails3yavieneconuncmodoarchivo.gitignore,queincluyeciertascarpetasqueno
tienesentidoqueseantrackeadas,nisubidasaservidoresdeproduccin.
Luegodelgitadd,sirealizamosungitstatus,GITanunciarquehaycambiosenelrbol.
Cambiosdeloscualeslnotienecopia.Paraserclaros:nohemoshechotodavala
entrega(elcommit).
git status
# On branch master
# Changes to be committed:
#
new file:
public/bienvenida.html
Realizaremosunanuevaentrega.Cuandonohaymuchoqueinformar,ynoqueremos
entraraleditor,podemosutilizarelmodificadorm,seguidodeunabrevedescripcin.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag76/197actualizadoal06/01/13
Sielservercontinacorriendo(railsserver),yapuntamoselnavegadorhacia
http://localhost:3000/bienvenida.htmldescubriremoselerror:nuestrocarcterseha
convertidoenalgoparecidoa
Ahoraintroducimosalgunoscambios:modificamoselarchivopublic/bienvenida.html:para
adecuarnosmasalstandardquedictalaw3,yleagregaremosalgunasetiquetas.
Loscambiosenelcdigovanennegrita
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
Bienvenido al Sistema
</title>
</head>
<body>
Holas Manolas!
</body>
</html>
Ahoragitstatusdeberamostrarelstatusde"modified".
Informamosdeloscambiosmediantegitaddpublic/bienvenida.html,oelmaspractico:
git add .
Mandamoscopiaalrepositorio,juntoconunabreveexplicacindeloscambiosquesehan
llevadoacabo:
git commit -m "Agregadas etiquetas <head>, <title> y <body>"
Elusohabitualdeloscomandosgitadd.seguidodecommitsepuedenresumirenuna
solaexpresin,conformadacomocommita
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag77/197actualizadoal06/01/13
Siahoraqueremosrevisarloscambiosintroducidos
git show --color
commit c28bc8f3622dcef3e4c431a604e01eef80cf9645
Author: Sergio Alonso <sergio@eim.esc.edu.ar>
Agregadas etiquetas <head>, <title> y <body>
diff --GIT a/public/bienvenida.html b/public/bienvenida.html
index cce29e9..3382961 100644
--- a/public/bienvenida.html
+++ b/public/bienvenida.html
@@ -1,3 +1,10 @@
<html>
-
Holas Manolas!
<head>
<title>
Bienvenido al Sistema
</title>
</head>
<body>
¡Holas Manolas!
</body>
</html>
Podemosobservarenrojo()laslneasmovidasoquitadas,yenverde(+)lasagregadas.
Nopuedosalirdelcomandogitlog/status/show!
Sielpromptdelalneadecomandosparece"atrapado",porelcarcter[:],ynonos
devuelveelcontroldelaconsola/MSDOS,nosepreocupe.Significaquelaconsolase
encuentrabajoelcomandoless,elcualposeealgunoscomandosparaperseguir
cambios,talescomolatecla/(buscarunapalabra),n(seguirbuscando),yotras,comoq
(salir).
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag78/197actualizadoal06/01/13
Recuerdequepuedeusarlateclaqparasalirdellog.
Sinotamuyconfusalasalidadelcomandogitlog,puedemejorarunpocolavisualizacin
jugandoconlasvariablesmencionadasenelmanualgitloghelp.Porejemplo:
git log --pretty=oneline --color
Alrespecto,BartTrojanowski,enhttp://www.jukie.net/bart/blog/pimpingoutgitlog
recomiendacrearunlogpersonalizado,inyectandolasiguientelneaalaconfiguracinen
elproyecto:
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset \
-%C(yellow)%d%Creset %s
--abbrev-commit --date=relative"
Tambienpuedevertodaslasramasqueincidansobreelproyectohaciendo
git log --pretty --graph color
Ahoratendremoslaposibilidaddehacergitlogennuestroproyectoyobtenerunresumen
muchomasclaro.SrvaseentraralapginadeBartparaveralgunosejemplos.
Interfaces grficas
Sideseaalgomassofisticado,sealegrarsaber
delaexistenciadegitgui,gitk,qgityel
grandiosomeld.
Puedeinstalarcualquieradeestasherramientas
medianteaptget,yescogerlasllamandolaspor
sunombrepararevisarelcambioentodala
carpeta,ohaciendoun
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag79/197actualizadoal06/01/13
Otrabuenacombinacinconsisteendetectarlosarchivoscambiadosejecutandoenlaraz
delproyectoagiggle.Cuandohemosdetectadoalgunoenparticular,podemoscomparar
suhistorialdemodificacionesabrindoloconmeld.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag80/197actualizadoal06/01/13
doslineasdedesarrollo.Aligualqueentodoslosproyectosdesoftwarelibre,todoeltiempo
hayramasinestables,confuncionesnuevas,enprocesodetesting,ylaramaestable,ya
comprobada,yconmenossorpresasparalosusuarios.
Aquesdondelasramasdedesarrolloylosnmerosdeversinaparecenparaayudarnos.
Todavanohemoscreadoramas,porlotantoseconsideraqueestamoseneltronco
originaldedesarrollo,omaster.
Respectodelosnmerosdeversiones,amododesugerencia,mepermitoexplicarlaforma
enqueseacostumbraaversionarenlacomunidaddesoftwarelibre.Bajoestacomunidad,
alasversionesquetodavanoestnlistas,selasexpresacondecimales.Porejemplo0.1,
0.3,etc,reservandolosenterosparalosestables.
AlgunosseguidoresdecreadordelkernelLinux,(ydelpropioGIT),elemblemticoLinus
Torvalds,acostumbranaversionarlapartedecimal,mediantenmerosparescuandose
encuentran"listasparalacomunidad".Losvaloresimparesindicanramasparausuariosque
testeanoquerequierendefuncionestodavanoprobadas.
As,unaversin0.1,o1.1estpidiendoquelarevisen,entantoqueuna0.2,omejoran,
una1.02indicaalmenosungradodeestabilidad.
Tambinseutilizanletrasenlosnmerosdeversin.Cuandounadelasramastestingha
llegadounciertogradodemadurez,yellanzamientoesinminente,seesperaquela
comunidadcolaboreenelseguimientodeerrores.Enestoscasosqueseiniciaunamaratn
debsquedadeerrores,seacompaaelnmerodeversinporeltrminoRC(Release
Candidate).
Deestamanera,vamosabautizarnuestraversincomo0.1,dentrodeltroncooriginal
master.
git tag 0.1 master
git tag 0.1
Supongamosahoraquequeremosincluirunafuncindelacualnoestamos
completamenteseguros.Realizaremoscambiosporvariaspartesdelproyecto,alpuntoque
podramosolvidarnosdentrodeunosdascuantoscosashemoscambiado.Prevemos
tambinqueenchufaremosgemasescritasporotraspersonas,queprobablemente
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag81/197actualizadoal06/01/13
modificaranvariaspartesautomticamente.Adecirverdad,quisiramosqueestaversin
seautilizadasolamenteporelusuarioqueactadeenlaceconelsistema(12).
Enlosprximoscaptulosrealizaremosvarioscambios.Sienunpuntolaaplicacinempieza
asoltarvaporportodoslados,comounalocomotoradesbocada,siemprepodremosvolver
anuestraramaestable.
Acontinuacin,generamosunaramatesting,basadaenlaactualmaster:
git branch testing master
Encualramaestamosparados?
git branch
* master
testing
Cambiamosalaramatesting:
git checkout testing
M
public/bienvenida.html
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag82/197actualizadoal06/01/13
git checkout -f
Simiramosahorahavueltotodoalanormalidad!
Estaordennosgeneraratodaclasedecosasnuevas:
invoke active_record
create app/views/depositos/show.html.erb
create db/migrate/20100314175320_create_depositos.rb
create app/views/depositos/new.html.erb
create app/models/deposito.rb
create app/views/depositos/_form.html.erb
invoke test_unit
create app/views/layouts/depositos.html.erb
create test/unit/deposito_test.rb
invoke test_unit
create test/fixtures/depositos.yml
create test/functional/depositos_controller_test.rb
invoke helper
invoke scaffold_controller
create app/helpers/depositos_helper.rb
create app/controllers/depositos_controller.rb
invoke test_unit
invoke erb
create test/unit/helpers/depositos_helper_test.rb
create app/views/depositos
invoke stylesheets
create app/views/depositos/index.html.erb
create public/stylesheets/scaffold.css
create app/views/depositos/edit.html.erb
Masadelantehablaremosdelaconvenienciadenombrareninglesalasclases,tablasy
camposdelosproyectos."Deposito"sedeberahaberllamado"Depot","encargado"
deberahabersellamado"manager",yas.Esdecir,hemosmetidolapata.
Anopreocuparse!Enestaocasin,haytodaclasedecosasnuevas.Demodoque
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag83/197actualizadoal06/01/13
ponemosaltantoaGITdelasnovedades:
git add .
Ycomonohemosrealizadotodavaningunaentrega("commit"),rebobinamostodoslos
cambios,hastaelltimocommit.
git checkout -f
Nohabiendoarchivosnuevosniborrados,nohacefalta(aunquenomolesta)realizarel
git add .
Esdecir,alhabersolounarchivomodificado,bastaconrealizaruncommita
git commit -a
Seabreeleditorsolicitandoleexpliquemoslanaturalezadeloscambios
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag84/197actualizadoal06/01/13
Acontinuacin,borramoslacarpetadoc.Alfinyalcabo,nadielalee.
rm -rf doc/
del doc /s /q && rd doc /s /q
AlhabercambiosenarchivosqueGITconoce,utilizamosgitadd.osimplemente
agregamosaalcommit.
git commit -a -m "documentacin borrada"
Finalmente,realizamosunaaccintpicadeRails:instalamosuncomponentedeotra
personaquenosfacilitalascosas.Enestecaso,unpluginquepermiteconmuypoco
esfuerzo,presentarcomo"paginas"loslistadosmuyextensos.
rails plugin install git://github.com/mislav/will_paginate.git
ruby script\rails plugin install git://github.com/mislav/will_paginate.git
Estecomandoiniciaunadescargadedatoshacialacarpetavendor/plugins.
Ledecimosalrepositorioquereviseelrbolenbuscadecarpetasyarchivosnuevos.
git add .
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag85/197actualizadoal06/01/13
Sorpresa!Cuandoiniciamoselserver
rails server
ruby script\rails server
Todosecolapsamiserablemente.Elmensaje:
/usr/lib/ruby/1.8/yaml.rb:133:in `load': syntax error on line 23, col -1: `'
(ArgumentError)
from /usr/lib/ruby/1.8/yaml.rb:133:in `load'
from /usr/lib/ruby/gems/1.8/gems/railties3.0.0.beta/lib/rails/application/configuration.rb:64:in `database_configuration'
Algoenlaconfiguracindelasbasesestmal.Alparecernuestrocambioen
config/databases.yml(hacetrescommits),nofuedelagradodelframework.
Sinembargo,nodeseamosborrarnielultimocambio(lainstalacindelplugin),niel
penltimo(elborradodedoc/).
Sideseamoscorregirerrorespuntuales,revisamosellog
git log --pretty=oneline
(Enrojoelcambioquenuncadebiserhecho).
Porlotantohagounrevert"solo"aesemomentoeneltiempo.
git revert b6712b8d76d5a7bd5a515797f141e9bacacee5a0
Unrevertescomouncommit:seabreeleditorpidiendolasrazonesdelarrepentimiento,
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag86/197actualizadoal06/01/13
aunquepodemosignorarlassimplementesaliendo.
Siahoracorremosnuevamenteelserverdepruebas,estedeberainiciarsinproblemas.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag87/197actualizadoal06/01/13
DurodeResetear
Luegodeuntiempo,descubrimosqueelpluginquehabamosinstalado...enrealidadnos
estorba.Yadems,sacarlacarpetadoc/fuemuymalaidea.
Podemosvolvereneltiempoabsolutamentetodo,destruyendotodoslos
cambios,hastaelltimocommit:
git reset --hard HEAD^
Sideseamosvolver#versioneshaciaatrs(revisarprimerocongitlog)
git reset --hard HEAD-#
Lapreguntaes:cuandomiaplicacinrealmentemegustaba?
Sinodeseamos"contarconlosdedos"cuantoscambiossehanidosucediendo,podemos
escogerunodeloshashquefiguranengitlog,mediantegitresethardSHA1_HASH
Enestecaso:
git log --pretty=oneline
9b7a92b6cc7be5dbf259ac4a19e8515a25978e65 agregado plugin para paginar fcilmente las
salidas
9139194255481f5d564c68732f9a62b92a3afd0c borrada carpeta doc/
b6712b8d76d5a7bd5a515797f141e9bacacee5a0 Agregadas lineas tentativas a database.yml
be3eb69feacfd658f3e11ef87f1280316a1a7e9a Agregadas etiquetas <head>, <title> y <body>
53873d5e91f9e527ae765e80faf7bb00b66fdf91 agregado archivo de Bienvenida
8af7a6da99cf51fdb808e7571de87a8db8e22255 - Agregados los archivos del proyecto Configuradas algunas variables
Volvemoscasialprincipiodelaramatesting:
gitresethardbe3eb69feacfd658f3e11ef87f1280316a1a7e9a
Siahorahacemos
git log --pretty=oneline
be3eb69feacfd658f3e11ef87f1280316a1a7e9a Agregadas etiquetas <head>, <title> y <body>
53873d5e91f9e527ae765e80faf7bb00b66fdf91 agregado archivo de Bienvenida
8af7a6da99cf51fdb808e7571de87a8db8e22255 Agregados los archivos del proyecto Configuradas algunas variables
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag88/197actualizadoal06/01/13
TodosloscommitsycambioshandejadodeexistirydesertenidosencuentaporGIT.
Bastadejugar!Volvemosalaramamaster
git checkout master
Borramoselpatiodejuegos
git branch -d testing
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag89/197actualizadoal06/01/13
Entramosalacarpeta,mediante
cd demo
Corremoselserverenmodotesting,ylodejamosmostrandosusoperacionesinternas:
rails server
InstalamosGIT.Posteriormente,creamosunrepositoriolocal.
git init
Agregamosalgunosarchivossinimportancia(gitadd.)entrecommitycommit(git
commit),loscorregimos.
Luego,paraprobaralgunoscambiosmascomplejos,creamosunaramatesting,mediante
laorden
git branch testing
Lallenamosdebasura,ylarompimosunpoco.Luegodeshicimosalgunos(ytodos)los
cambios.Volvimosalaramamaster,mediante
git checkout master
Yfinalmenteborramoslaramatesting.
git branch -d testing
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag90/197actualizadoal06/01/13
Captulo5
Captulo 5: Hola Mundo en Rails
CuandoelnavegadorhaceunsolicitudalservidorWeb,yestaesparseadaalaaplicacin
Rails,laURLesdescompuestaenbuscadeunaaccinasociada.Lasaccionesestn
definidasdentrodeloscontroladores,quienesdecidenquehacerconlaURLcargadaenel
navegador.
Estoqueenprincipiosuenaconfuso,escomn(ymuchomasdifcildeconfigurar),enlos
demsframeworksdelmercado.Sinembargo,esmuytilparacreardireccioneslegibles
porsereshumanos,yspidersdebuscadores.Convengamosqueesmuchomasfcil
recordar:
http://www.mascotas.org.ar/adopciones/modificar/46
queladireccin.
http://www.mascotas.org.ar/adopciones.php?id=46&accion=modificar
Esdecir:RailsanalizalaURL(direccin)yladescomponeparaencontrar
Elcontrolador
Laaccin
Otrosparmetros
Enelsiguientecaptulovamosaintentarnuestraaplicacinrespondadeformadistintaalas
siguientessolicitudes:
/hola
Enestecasoelnavegadordebemostrarunsimple"holaMundo"
/hola/4
Aquencambio,el4debeserredirigidohaciaalgunaseccindondesalude
"calurosamente",esdecir,cuatroveces.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag91/197actualizadoal06/01/13
Controladores y Acciones
"Turutaesmiruta"
Anibal,"elNumberOne"
Antesdecomenzar,vamosacrearnuevamenteunaramadondeprobarcosas,sinponer
enriesgolaaplicacintalcomoest.Noescuestinquenosechenlaculpadesdeel
ColisionadordeHadronescuandolascosascomiencenaexplotar.
git branch holamundo
Cambiamosaestanuevarama
git checkout holamundo
Opcional:estaramatienesu
origenenlaversin0.1de
master.Esdecir,sialguien
consultasunmerodeversin
(gittag),laconsiderar
estable(14).
Paradejarclaroquesetratadeunpolgonodetiro,yquesuscambiossolodeberanser
utilizadospordesarrolladorescercanosalproyecto,lepodemossituarunvalorimpardetrs,
como.1
Masadelanteveremoscomosituarnuestroproyectoenunrepositoriopblico.Estos
repositoriostienenlaposibilidaddepermitiralosusuariosquetirendelaramaquedeseen.
Sinoseespecificaotracosa,tirarandelamaster.
14 Nuevamente,ejemplosconelkernellinux:
1.2.1estable
1.3.5inestable
2.5.xinestable
2.6.48estable
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag92/197actualizadoal06/01/13
VolvamosaRails,yaltratamientodelasURLs:elarchivoquetraducelasdireccionesydirige
eltrficohacialasacciones,seencuentraenconfig/routes.rb.Loabrimos,yleagregamos
laslneasennegrita:
Cuidadoalcopiar.Ciertaslneas,cuyoorigenenelPDFeselISO88591,
setraducenmalenelUTF8delaterminal(Linux)oenelWindows1852(MSDOS)
Consejo:noseavagoyescribamanualmenteloscomandos.
Demo::Application.routes.draw do |map|
match ':controller(/:action(/:id(.:format)))'
end
Deestamanera,RailsdescomponeladireccinURLylareenvaalcontroladoraccin
adecuado.Crearemosuncontrolador
rails generate controller hola
ruby script\rails generate controller hola
Abrimosapp/controllers/hola_controller.rb,yleagregamosdosacciones:
class HolaController < ApplicationController
def mundo
render :text => "Hola <b>Mundo</b>"
end
def caluroso
@valor=params[:id].to_i
end
end
Reiniciamos(Ctrl + C)elservidorWeb,ycargamosenelnavegadorladireccin
http://localhost:3000/hola/mundo
Enestecaso,loquehasucedidoesmuysimple:laaccinmundohacreadounapequea
vistamediantelaordenrender,conunbrevemensaje.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag93/197actualizadoal06/01/13
Sinembargo,deberamoshabercreadounarchivollamado
app/views/hola/mundo.html.erb
AunpuristadelMVCnolegustaraesteejemplo.Hemosensuciadounaaccin(enlas
barbasdelcontrolador!)conetiquetas<b>detipohtml.
Ases:enocasiones,pararespuestassimples,seinstalacdigopropiodelaVista
medianterender,enplenaAccin.Porsupuesto,noesconveniente,yaqueconeltiempo
secomplicaralavisualizacinylaseparacindecontenido(15).
Vamosalotroejemplo.Laideaesquelamaquinasaludecalurosamente:variasveces,
deacuerdoaunvalorpasadoporURL.
Sinembargo,siintentamosconladireccinhttp://localhost:3000/hola/
caluroso/
4
,
obtendremosunerrordeTemplate(oVista),locualescorrecto:recordemosqueenla
segundaaccin,nocreamosunavistamedianterender,sinoquenoslimitamosarecibirlos
datos,procesarlos(sihacefalta),ydejarlosdisponiblesparalavistaasociada.Aqurepitola
parteencuestin:
def caluroso
@valor=params[:id].to_i
end
Podemosobservarqueelvalor4pasadodesdelaURL,haquedadodisponiblebajola
variableparams[:id].Porcierto,losvaloresquesepasandeestamanera,quedan
expresadoscomocadenas,demodoquesiqueremosrealizaroperacionesmatemticas
sobrel,debemosconvertirloaentero(.to_i).
15 Seexponeesteejemplo,dedicadoaaquellosprogramadoresquegustandeunificartodo.Dosframeworks
pequeosypotentesquenoimplementanMVC,ymantienentodaslascosasunidas,sonPadrinoySinatra.
OcomodiraFontanarrosa:"elsigloXXInosencontrarunidosyamontonados".
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag94/197actualizadoal06/01/13
Elvalor4espuestoarecaudoenunatributo@valor,accesibletambinporlavista,lacual
sedisparainmediatamentedespusqueterminalaejecucindelaaccin.EnRails,cada
accintieneunavistaasociada.Elerrorrecinobtenidoexplicaclaramentequenohay
unavista(template)disponible.
Paraelcasodeestaaccin,fabricamosunarchivoenapp/views/hola/caluroso.html.erb,
cuyocontenidodebeparecersealsiguiente:
Denuevo:cuidadoalcopiarpegar:lacodificacindeloscaracterespuedevariarenel
destino.
<% for i in 0..@valor %>
<p>
<%= "Hola Mundo " %>
<%=i %>
<% end %>
Enestaslneas,recorremosde0a4,saludandocalurosamenteencadavuelta.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag95/197actualizadoal06/01/13
Parafinalizar:esteltimoarchivo,app/views/hola/caluroso.html.erb,noexisteenel
repositorio:
git add .
Recuerdenquesialgoandamal,podemosempezardenuevolacreacindelhola
mundo,mediante
git add .
git checkout -f
Ahoraabrimosnuevamenteelarchivoconfig/routes.rb,
yleagregamosunalnea
root :to => "hola#principal"
Sibienelcontroladorholaexisteytienedosaccionesadentro,laaccinprincipalanno
existe.Editamosapp/controllers/hola_controller.rbyleagregamos
def principal
end
Noesunaaccinmuyimpresionantequedigamos.Perocumpleunasimplefuncin:
cuandoterminesuejecucin,Railsbuscarunavistaasociadaen
app/views/hola/principal.html.erb
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag96/197actualizadoal06/01/13
Estearchivonoexiste,demodoquelocreamosconelsiguientecontenido
<h1>Pgina principal</h1>
o tambin
<h1>Página Principal</h1>
Sitodoanduvobien,ahorahttp://localhostdeberamostrarnos
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag97/197actualizadoal06/01/13
Parafinalizar,entregamosloscambiosaGIT
git commit -m "holamundo funcionando"
Sirecuerdan,estamosparadosenlaramaholamundo.Volvemosalazonaestable.
git checkout master
Ydesdelaramamaster,mezclamos("merge")lasnuevasyflamantesinnovaciones
presentesdelaramaholamundo.
git merge holamundo
Opcional:tambinpodramosactualizarlaversindelaramaestable:
git tag 0.2 master
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag98/197actualizadoal06/01/13
Captulo6
Captulo 6: ActiveRecord
ActiveRecordesunabibliotecacapazderealizarMapeosRelacionalesdeObjetos(ORM).
LasabstraccionesORMsirvenparaaccederalosdatosdelosmotoresSQL,sinpreocuparse
porlasintaxisdecadamotorenparticular.Ademsotorgalafacilidaddetrataralastablas
comoobjetos,yasuscamposcomoatributos.
Estalibrerapuedeahorrarnosmontonesdelneasdecdigo.Sinembargo,paralograrsu
magia,realizaunaespeciedepactoconelprogramador,queconvienerespetar.
Paraempezar,Railsesunframeworkqueseadscribeaunafilosofadenominada
ConvencinenvezdeConfiguracin,locualaceleraengranmedidaeldesarrollo.
Unadesusconvencionesestrabajareningles.Estonosorprendenimolestaaningn
programadoracostumbradoatrabajarenfactorasdesoftware.Inclusoesmuytilsise
deseaabriryacelerareldesarrollodelproyectoatrayendoaprogramadoresdela
comunidaddeSoftwareLibre.
As,sivamosatenerunatabla"Compaas",latrataremoseningls.Tambindebemos
atenernosalasconvencionesdeRails,ycuidandomaysculasytiemposverbales.Ejemplo:
Tabla:companies
Modelo:Company
Archivoquecontendrladefinicin:app/model/company.rb
Laclaveprincipaldelastablassiempreserid,no"id_company","cod_company"o
engendrossimilares.
Lasclavesajenassiempreterminarnen_id,ejemplo:category_id, status_id,
etc
Sepuedeutilizarnombrescompuestos"CamelCase"enlosmodelos,peroenciertaspartes
paralascualesRailsdebemantenercompatibilidad,seutilizarel_separandoambos
trminos.Porejemplo,enelseguimientodeerratasdeestelibro,utilizounmodeloErrorType
quedescribeeltipodeerrordescubiertoporellector(Tcnico,Ortografa,Sugerencia).La
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag99/197actualizadoal06/01/13
tablaasociadasererror_types.Ysiotratablaposeeunndiceajenoqueapuntaaesta
tabla,elnombredelacolumnasererror_type_id.Larelacindescriptaenelmodelodela
otratabla,porejemplobelongs_to,serhacia:error_type.
Estasconvencionesimpacientanamuchosprogramadores,peroagradaalamayora,ya
quelepermiteaRailstrabajarautomticamente,yprescindirdefastidiosasconfiguraciones
XML,comolasexistentesenStruts,Spring,odiversosmtodosdepersistencia.
PorestaraznlosframeworksqueusanConvencinenvezdeConfiguracinsontildados
de"fascistas".Enenelbuensentidodelapalabra:fascismoserefierealaimposicinde
unaideaporpartedemuchaspersonas.PerosucedequelasideasdeRailssonmuy
buenas,yhansidoconsensuadaspormuchosyexcelentesprogramadores.
Esteaspectofascistasedetectaendosaspectos:elidioma,ylasconvenciones.
Yavimoslasconvenciones.Encuantoalidioma,serecomiendatrabajarlomasposibleen
ingles,puestoqueRails"intuye"mejorenestalengua.Porsupuesto,haydiversoshackso
"inflections",quepermitentrabajarconunRailsespaolizado.Sinembargo,norecomiendo
molestarseenhackearRails:elingls,nosgusteono,eslalenguaquesehablaenel
mundodelaprogramacin.
Norecibiremosmuchaayudaenlosforossinosempeamosenquechinos,rusos,rabes,
alemanes,etc,debanentenderqueelsignificadodelapalabra"deposito".Sitenemosuna
buenaidea,ycreemosquesepuedeconvertirenalgorealmentegrande,podemossubir
nuestroproyectoaunrepositoriopublicoyllamaratodalacomunidaddesoftwarelibre
paraquecolabore.TodosagradecernquenoshayamosmolestadoenacudiralGoogle
Translate,paracambiareltrmino"Depsito"por"Depot".
Coincidirconmigoenqueaumentarnlaposibilidadesqueotraspersonasnosayudenen
nuestroproyecto,simantenemoscompatiblestodaslaspiezas.
UstedmismoentrarmuchasvecesaRubyForgeoaGitHubabuscaralgnpedazode
cdigoqueleahorresemanasdetrabajo.Leaseguroqueagradeceramasdeunhind,
questehayaignoradosunatalhindi,yenlugardeutilizar""paradefinirun"deposito",lo
hayaexpresadocomo"depot".Almenosenespaolcompartimoselmismojuegode
smboloslatinos.Pienseeneltrabajoquelehatomadoalhind,cambiarhastasualfabeto
denacimiento!
Finalmente,elhechoquelaaplicacinpordentropienseeningls,nosignificaquehable
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag100/197actualizadoal06/01/13
eninglsconelusuario.Railsvienemuybienpreparadoparainternacionalizar("i18n")la
interface.Nuestrosusuarios,ylosusuariosdenuestrosprogramadoreshindes,podrn
cambiarelidiomaaeleccin:esloquesedice...unaaplicacinbienconstruida!
Elsegundoaspectoaanalizareslanomenclaturaquedeberamosrespetarentablas,
ndicesynombresdeclase.Lacualnodeberasercomplicadadeseguir...aexcepcin
queestpensandoenreprogramarunaaplicacinanterior.Nosepreocupe:empleando
laaclaracinnecesariaenlosmodelos,sepuedeusarcualquiernombreenlastablase
ndicesexistentes.
active_record
create
db/migrate/20100314191942_create_empresas.rb
create
app/models/empresa.rb
invoke
test_unit
create
test/unit/empresa_test.rb
create
test/fixtures/empresas.yml
EnestepuntoRailscalculaquelatablasellamarempresas,yqueelidseruncampo
llamadoid.Sinembargo,supongamosquetenemosunatabla(sindatos,cuidado!)
llamadaempresa(ensingular),conclaveprincipalcod_empresa,yuncamponombre.
1. Durantelaordenmigrate,hemoscreadounarchivo
db/migrate/20100314191942_create_empresas.rb
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag101/197actualizadoal06/01/13
Estearchivocumpledospropsitos:enunosinstantes,serutilizadoporunscript
llamadorake,queutilizarlasdefinicionesexistentesenlpara:
Crearfsicamentelastablasenbasededatos.
Crear/Actualizarunarchivodb/schema.rb,elcualposeeclasescon
informacindetodaslastablasexistentesenlabasededatos:elcoraznde
ORMo"ObjectRelationalMap".
DeberamosinterceptarestearchivoantesqueRailsloprocese.
a) Loabrimosyloalteramosdelasiguientemanera(cambiosennegrita):
class CreateEmpresas < ActiveRecord::Migration
def self.up
create_table :empresa do |t|
t.column :nombre, :string
t.column :cod_empresa, :integer
t.timestamps
end
add_index :empresa, :cod_empresa
end
def self.down
drop_table :empresas
end
end
b) Ejecutamosrake:
rake db:migrate
== CreateEmpresas: migrating
=================================================
-- create_table(:empresa) -> 0.0016s
-- add_index(:empresa, :cod_empresa) -> 0.0003s
== CreateEmpresas: migrated (0.0021s)
========================================
Antesdeseguir,podemosconstatarlacreacinfsicadelatabla,medianteel
pluginSQLiteManagerdeFirefox(HerramientasSQLiteManager).Tambines
recomendablemirardentrodedb/schema.rb,ladefinicindelaclaseEmpresa.
2. Ascomoenschema.rbestnlasdefinicionesdelastablasexistentesennuestra
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag102/197actualizadoal06/01/13
aplicacin,cadaunadelastablastieneunmodelorelacionado.
Abrimosapp/models/empresa.rbyloalteramossegnnuestrasnecesidades.Eneste
caso:
class Company < ActiveRecord::Base
set_table_name 'empresa'
set_primary_key 'cod_empresa'
end
Recuerde(unavezmas),quesiduranteestecaptulohacometidounerror,puede
comenzarlodevueltaborrandoloscambios:
git add .
git checkout -f
Comprobar todo
UnamaneradeaveriguarsiRubyescapazdeutilizarestatabladscola,esdecir,noatada
alasconvenciones,escrearalgunosdatosdesdelaconsola:
rails console
ruby script\rails console
SerciertoqueahoraRailsrespetanuestrocod_empresaenlugardesuid?
irb(main):004:0> unaempresa
=> #<Empresa id: 1, nombre: "Pastas Alfredo", cod_empresa: 1, created_at: "201003-14 19:54:05", updated_at: "2010-03-14 19:54:05">
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag103/197actualizadoal06/01/13
irb(main):005:0> unaempresa.cod_empresa
=> 1
irb(main):006:0> unaempresa.id
=> nil
Nota:derealizaralgncambioenlosmodelos,sedebevolveraingresararails
console,yreiniciarporciertorailsserver
Resumen
Esperoquehayadisfrutadodeestaseccin.Sibienescompleja,esmuyposiblequedeba
tenerlaencuentaparacuandomigresusaplicacionesactualesaRails.
Noobstante,noutilizaremoslaclaseEmpresanisusmodelos,sinosusequivalentesen
ingls,demodoquedaremosvueltaatrscontodasestasanticonvenciones:
git add .
git checkout -f
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag104/197actualizadoal06/01/13
Comosugerencia,unamaneradenopreocuparseporlosdetallesdeimplementacinde
labasededatos,consisteenutilizarSQLite,almenosparalasetapasdevelopmentytest.
Luegopuedeusaradaptadoresparaotrascosasmaspotentes.Entoncesrakeseencargar
decrearunabasadaproductionsobre,porejemplo,PostgreSQL,conlaestructuradela
basedevelopment.
LasbasesRDBMSnormalmenteatiendenenunpuerto,custodiadoporunservicioo
"daemon",yocupandorecursosinclusocuandonoselasutiliza.PeroparausarSQLite,no
hacefaltainstalarmasqueunospocospaquetesbsicosylasgemas.Unamala
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag105/197actualizadoal06/01/13
comparacin,podranserlosarchivos.mdbdeAccess.
Lasbases,alestilodeAccess,odeFoxPro,seguardanenlacarpeta/db.
PorqueutilizarSQLite?EnrealidadpuedeutilizartodaclasedemotoresSQL.Peroeste
pequeomotorserecomiendamuchoenlacomunidaddesoftwarelibreporlassiguientes
razones:
Esmuyrpidoparaconsultas
Esmuyportable:puedeserempaquetadoenmotorcitosAjaxcomoGoogleGears,
AdobeAIRyotros,paracacheardatosdelladodelcliente.
ElprincipiodetrabajodeSQLiteesmuysimple.Podramoscrearlabasemediantealgn
administradordeSQLite,orealizando:
sqlite3 db\development.sqlite3
peroestoimplicaraquequeremosaprenderahacerlascosasalestiloSQLite3.Pero
recordemosquenuestroORM,ActiveRecord,deseaquenonospreocupemosporelmotor
SQL.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag106/197actualizadoal06/01/13
Captulo7
Captulo 7: A levantar los andamios: Scaffolds
Enciertamanera,losscaffoldssonloscaballosdebatalladeRails.
Setratadeunosscriptscapacesdecrearmodelos,vistasycontroladoresapartirdeunos
pocosdatos.SonmuybuenosparacrearABMs(altas,bajasymodificaciones)enforma
rpida,paraluegopersonalizarlosagusto(16).
Comenthaceunaspocashojas,laideadetrabajar,mediantelasconvencioneseningles.
PorellohemosborradotodareferenciaaEmpresa,alavezquecomenzamosconunnuevo
modeloCompany.Elscriptscaffoldnoscrearademslasrutas,algunasvistas,einclusoel
controlador.
rails generate scaffold Company name:string address:string active:boolean
ruby script\rails generate scaffold Company name:string address:string
active:boolean
exists
app/models/
exists
app/controllers/
exists
app/helpers/
create
app/views/companies
exists
app/views/layouts/
exists
test/functional/
exists
test/unit/
create
test/unit/helpers/
exists
public/stylesheets/
create
app/views/companies/index.html.erb
create
app/views/companies/show.html.erb
create
app/views/companies/new.html.erb
create
app/views/companies/edit.html.erb
create
app/views/layouts/companies.html.erb
create
public/stylesheets/scaffold.css
create
app/controllers/companies_controller.rb
16 LosABMspuedenserencontradosenpginaseninglscomoCRUD(Create,Read,Update,Delete).
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag107/197actualizadoal06/01/13
create
test/functional/companies_controller_test.rb
create
app/helpers/companies_helper.rb
create
test/unit/helpers/companies_helper_test.rb
route
dependency
map.resources :companies
model
exists
app/models/
exists
test/unit/
exists
test/fixtures/
create
app/models/company.rb
create
test/unit/company_test.rb
create
test/fixtures/companies.yml
create
db/migrate
create
db/migrate/20100111165913_create_companies.rb
Corremoslamigracin:
rake db:migrate
==
-- create_table(:companies)
-> 0.0057s
==
AbrimosFirefoxenladireccinhttp://localhost:3000/companies
Nadamalpara2(dos)lneas.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag108/197actualizadoal06/01/13
Observelalneaqueconstruyelaclaseo"modelo",app/models/company.rb.Tambin
podrapreciarlacreacindelcontrolador,ydevariasvistascorrespondientesaacciones
ABM(index,new,edit,show).
LosscaffoldssontilespararealizarrpidamenteelABMdeunatabla,yaprenderunpoco
delarailswaysdehacerlascosas.
AvisamosaGITquecomienceaseguiralosnuevosarchivos:
git add .
Siesttodobien,entregamosloscambiosmediante
git commit -m "Scaffold de Compaias"
Casocontrario
git checkout -f
Enestafase,esimprescindiblerevisarlamagiadetrsdescaffold
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag109/197actualizadoal06/01/13
app\controllers\companies_controller.rb
app\models\company.rb
app\views\companies
edit.html.erb
index.html.erb
new.html.erb
show.html.erb
Muybienlosandamios...perodondealmacenanlosdatos?
PodemosconstatarlasinsercionesmediantealgnadministradorparaSQLite,talcomo
SQLiteManager(plugindeFirefox).VimossusdetallesdeinstalacinenelCaptulo1.
MedianteSQLiteManagerpodemosabrirelarchivodb\development.sqlite3.Allpodremos
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag110/197actualizadoal06/01/13
constatarlacreacindelatablaysueventualllenadodesdelavistanew.
Porcierto:rakenoshaconstruidotodosloscampos,maselid,ydoscamposmuytiles:
created_atyupdated_at
Cmosabarakequecosascrear?
Sirecordamoslasalidadegeneratescaffold,notaremoslapresenciadeunarchivo
db/migrate/20100506030728_create_companies.rb
Estearchivocontieneladefinicinrespectodecomodeberasercreadalaclase,sureflejo
endb/schema.rb,ysuscampos.
Comolohizorake?Esunbuenmomentopararevisarelarchivodebitcora.
AllnosencontraremosconunmontndeinstruccionesSQLquehechoActiveRecordpor
nosotros:instruccionesCREATETABLE,CREATEDATABASE,etc.
Nota1:EnWindows,debidoaqueestearchivoestescritoenutf8,yMSDOStrabajaen
ASCII,lasalidaenpantallacontendralgunoscaracteresextraos.
Nota2:EnLinuxseacostumbraausartailfenlugardelanticuadomore.Enestecaso,
tail -f log/development.log
Estecomandomantienecapturadalaterminalmientrasrelata(tail)loscambiosalfinalde
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag111/197actualizadoal06/01/13
unarchivo.Siqueremoscortarloyretomarlaconsola,pulsamosCtrl+C
OtraopcinenUbuntu,esabrirestearchivomedianteunautilidadqueseencuentraen
Alt+F1SistemaAdministracinVisordeArchivosdeSuceso
Ennuestromismocdigotambinpodemosvolcarallog.Encualquierpartedeuna
accin,podemosagregarlneasalestilo:
logger.info("#{Time.now} Borrando una empresa cuyo ID es el ##{@company.id}")
Estoesmuytilparadejarregistroenlog/sobreciertossucesosimportantesdelavidadela
aplicacin.Yousoestosregistrosparamonitorearmomentoscrticos,comociertasnoches
enquemisservidoressincronizansusbases.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag112/197actualizadoal06/01/13
Captulo8
Captulo 8: Validaciones
Validaresunpasoaburridoduranteeldesarrollodetodaaplicacin.Suobjetoesimpedirla
entradadedatosquecorrompanlabase.No,nosetratadedinero.Setratadevalores
vacos,repetidos,letrasenlugardenmeros,etc.Desgraciadamente,esunpasoquelos
programadoresdebenhacerloporduplicadoentodaslasetapasdelaaplicacin:durante
losnew,losedit,etc.
RailshabamosmencionadoqueseadscribealmodeloDRY(noterepitas),demodoque
aclaramosnuestraregladevalidacinenelmodelo,yActiveRecordcuidarquenunca
ingresendatossucios.
Abrimosapp\models\company.rb,ylodejamosdelasiguienteforma:
class Company < ActiveRecord::Base
validates_uniqueness_of :name, :message => "Esta empresa ya existe en base"
validates_presence_of :name, :message => "necesito un nombre"
validates_presence_of :address
end
Vaya!Esofuemuyrpido!
YsiUd,miqueridoprogramador
dePHPestlagrimeandodela
emocin,busqueotropauelo,
eintenteeditarunregistroy
borrarelvalorenaddress.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag113/197actualizadoal06/01/13
Captulo9
Captulo 9: La imagen no es nada: Layouts y CSS
Loslayoutsserendereanantesquelasvistas,ytcnicamente,las"envuelven".
Sirvenparaalojarbarrasdebotones,encabezados,publicidad,etc.Porcadacontrolador
generadomediantescaffold,hayunlayoutgeneral.Ysideseamos,podemoscrearun
layoutgeneral,yhacerquetodosloscontroladoresbusquenalmismoantesderenderear
susvistas.
Loslayoutssonopcionales,peronosaligeraneltrabajodetenerquedisearestos
elementosenCADAcomponenteABM.
Porejemplo,paratodaslasvistasalojadasenapp/views/movies,existirunlayouten
app/views/movies/movies.html.erb
Deestamanera,loslayoutssonunasolucinelegante,quehastaahorasolosehaba
solucionadoconframes,maspropiosdelosaos90,omediantelasplantillasde
Dreamweaver(noCSS,ydependientesdeesteonerosoeditor).
Enunalardedemetrosexualismo,loscreadoresdeRailsdisearonloslayoutsparaquese
conectaranalasvistasmedianteDIVs(porCSS),ynomediantetablas.
Esto,enunprincipioresultamolesto,yaquedebemosentenderunpocodeplantillasCSS.
Sinembargo,esunacorrectaprcticadeprogramacin.
CitandoallibroIntroduccinaCSS,escritoporJavierEguluzPrez,ypresentegratuitamente
enwww.librosweb.es:
"Eldiseodelaspginaswebhabitualessedivideenbloques:cabecera,men,contenidos
ypiedepgina.Visualmente,losbloquessedisponenenvariasfilasycolumnas.Poreste
motivo,hacevariosaoslaestructuradelaspginasHTMLsedefinamediantetablas.
EldesarrollodeCSShapermitidoquesepuedanrealizarlosmismosdiseossinutilizartablasHTML.Las
principalesventajasdedisearlaestructuradelaspginaswebconCSSenvezdecontablasHTMLson
lassiguientes:
Mantenimiento:unapginadiseadaexclusivamenteconCSSesmuchomsfcilde
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag114/197actualizadoal06/01/13
mantenerqueunapginadiseadacontablas.Cambiarelaspectodeunapginacreada
conCSSestanfcilcomomodificarunaspocasreglasenlashojasdeestilos.Sinembargo,
realizarlamismamodificacinenunapginacreadacontablassuponeunesfuerzomuy
superioryesmsprobablecometererrores.
Accesibilidad:laspginascreadasconCSSsonmsaccesiblesquelaspginasdiseadascon
tablas.Dehecho,losnavegadoresqueutilizanlaspersonasdiscapacitadas(enespeciallas
personasinvidentes)puedentenerdificultadesconlaestructuradelaspginascomplejas
creadascontablasHTML.Noobstante,disearunapginawebexclusivamenteconCSSno
garantizaquelapginaseaaccesible.
Semntica:aunqueresultaobvio,lastablasHTMLslosedebenutilizarparamostrardatoscuya
informacinsloseentiendeenformadefilasycolumnas.Utilizartablasparacrearlaestructura
completadeunapginaestanabsurdocomoutilizarporejemplolaetiqueta<ul>paracrear
prrafosdetexto.
Porestosmotivos,laestructurabasadaentablashadadopasoalaestructurabasadaexclusivamente
enCSS.AunquecrearlaestructuradelaspginassloconCSSpresentaenocasionesretosimportantes,
engeneralesmssencillayflexible."
nimo!Noestandifcil:enhttp://del.icio.us/karancho/cssmencionovariasfuentesde
inspiracin,generacindelayouts,menes,ytodolonecesarioparaaprender
rpidamentediseoseinterfacesprofesionales.
Actividades
1)Entreahttp://www.bunker.org.ar/incubadora/LibroRails3
2)Descargueelarchivolayouts_css_imagenes_extras.rar
3)Descomprimaelcontenidosobrelarazdesuproyecto
Concretamente,asegresequemiscarpetas
app
public
sobrescribanlassuyas.
4)Noserademipatticodiseo.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag115/197actualizadoal06/01/13
Concretamente,elarchivocomprimidocontiene:
Archivoejemplo
app\models\company.rb
Explicacin
Lasvalidacionesqueyavimos.
Ciertaszonas(<div>)queRails"renderea"antesque
app\views\layouts\companies.html.erb
lasVistas(edit.html.erb,index.html.erb,new.html.erb,
etc.)
public\images\avatar_sergio.png
public\stylesheets\sergio.css
Laimagendearribaalaizquierda.
Desarrollodelaszonas(<div>)solicitadasporellayout.
Estoesubicacin,margenes,colores,etc
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag116/197actualizadoal06/01/13
Captulo10
Captulo 10: Uno para Todos...
"Encuentrauntrabajoqueteguste
ynovolversatrabajar
niunslodadetuvida".
Confucio
EnestafaseahondaremosenalgunosaspectosmasavanzadosdeRails.
Deboadmitirquetodoloquehabamoslogradohastaahora,lopodramoshaberrealizado
enPHP,sintenerqueaprenderunlenguajenuevo.
Muchosprincipiantesprefierentrabajardesdeelprincipioenformacasiartesanal(PHP/
ASP),paradescubrirqueunproyectopuedecrecerhastahacersemuydifcildemantener.
Cuandoenunproyecto,sustablas,relaciones,tiempodecarga,etc,comienzanacrecer,
escuandolosframeworksdemuestransuvala.TradicionalmenteseemigraaJava/.NET,
conellargusimoeintensoentrenamientoqueestosupone,almenosde1ao,y
practicandocomounviolinista(17).
Afortunadamente,enestosltimosaosPython(conDyango),yRuby(conRails,Sinatray
otros)hantradoopcionesfrescas,originalesypotentesalmundodeldesarrolloweb.
EnelmundodelosframeworkswebreinanindiscutiblementeJava(Struts,Spring,JSF),
debidoasucomprobadaflexibilidadyrobustez.
Sinembargo,estosltimosaos,losmismosprogramadoresquepasansusemanalaboral
enJavay.NET,seconectanlosfinesdesemanaalosforosdePythonyRuby,locualindica
uninminentecambiodeparadigma.Losmoderadoresdelosforosconcuerdan:almenos,
programarenRubyyenPythonesdivertido18.
17 Aproximadamente4(cuatro)horasdiarias.
18 Fuente:http://www.vivalinux.com.ar/articulos/pythonyrubymasdivertidos
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag117/197actualizadoal06/01/13
Tablas Combinadas
Lascompaasposeenmasdeundepartamento:Ventas,AtencinalCliente,etc.
Generaremosmodeloycontroladordedepartamentosenunsolopaso:
Siobservamoslasalidagenerada,veremosqueRailshageneradoarchivosparacuando
estemoslistospara"migrar",estoes,crearenelmotorSQLunreflejofuncionaldenuestro
modelo.
exists
app/models/
exists
app/controllers/
exists
app/helpers/
create
app/views/departments
exists
app/views/layouts/
exists
test/functional/
exists
test/unit/
exists
test/unit/helpers/
exists
public/stylesheets/
create
app/views/departments/index.html.erb
create
app/views/departments/show.html.erb
create
app/views/departments/new.html.erb
create
app/views/departments/edit.html.erb
create
app/views/layouts/departments.html.erb
identical
public/stylesheets/scaffold.css
create
app/controllers/departments_controller.rb
create
test/functional/departments_controller_test.rb
create
app/helpers/departments_helper.rb
create
test/unit/helpers/departments_helper_test.rb
route
dependency
map.resources :departments
model
exists
app/models/
exists
test/unit/
exists
test/fixtures/
create
app/models/department.rb
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag118/197actualizadoal06/01/13
create
test/unit/department_test.rb
create
test/fixtures/departments.yml
exists
db/migrate
create
db/migrate/20100113040955_create_departments.rb
Concretamente,yentremuchasotrascosas,hageneradounarchivo
db/migrate/2009nnnnnnnnnnn_create_departments.rb
Leledamosunamirada,ychequeamosqueapareceuncampo(creadopornosotros
duranteelscaffold)llamadoapropsitocompany_id:integerestosignificadoscosas:
Debeexistirunaclase(modelo)Companyporalgnlado.Elscaffoldlahacreado
pornosotrosenapp\models\department.rb
SegnlaconvencindeRails,cuandomencionamosuncampoterminadoen_id,es
porqueloestamosdeclarandocomoclaveexternadeotratabla.
rake db:migrate
==
-- create_table(:departments)
-> 0.0054s
==
Oalgoas...
Esdecirqueporabajo,simiramoselarchivolog\development.log,nosencontraramosuna
charlaentreActiveRecordyelmotorSQLite,detipoCREATETABLE,etc.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag119/197actualizadoal06/01/13
Formalizar la relacin
Sibienhemosestablecidolarelacinentreambastablas,mencionandoelndicedeuna
comoclaveajenadeotra,nohemosaclaradosiesunarelacindeUnoaUno,deUnoa
Muchos,odeMuchosaMuchos.
Lapresenteexplicacintieneporpropsitointroducirsoloalosejemplosaqupresentados.
ParaverunamuycompletaguasobrelasrelacionesentrelosmodelosdeActiveRecord,
serecomiendaenfticamenteconcurriralaexcelenteguapresenteen
http://guides.rubyonrails.org/association_basics.html
Entrminosgenerales,abrimosambosmodelos,ylesexplicamosaRailsqueunacompaa
puedetenervariosdepartamentos.Entantoqueundepartamentoperteneceraunasola
compaa.
Sirecuerdanlasreglasdeintegridadreferencial,recordarnelviejoadagio"enunarelacin
deUnoaMuchos,laclavedelosunos(Compaa)seencuentradelladodelosmuchos
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag120/197actualizadoal06/01/13
(Departamentos).Estaeslaraznporlacualundepartamentoposeeuncampo
company_id.Yloaclaramosmediante"belongs_to".
Lohacemosenlacarpetaapp\models.Enestacapturadepantalla,gvimeditaambos
modelosalavez.
Integridad Referencial
Fuente:http://guides.rubyonrails.org/migrations.html,accedidoelsbado,21dejuliode
2012
Unapreguntaquesehacentodoslosprogramadoresquellegandeotroslenguajes,es
comomanejaRailslaintegridadreferencial.Alfinaldelvinculomencionado,David
HeinemeierHanssonmencionaquedesdeelpuntodevistadeActiveRecord,ydemediar
bienlasvalidacionesenlosmodelos,nohacefalta.Dehechoenlaguaoficialde
asociaciones,http://guides.rubyonrails.org/association_basics.html,mencionaalgunos
trucos.Porejemplo:
classCustomer<ActiveRecord::Base
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag121/197actualizadoal06/01/13
has_many:orders,:dependent=>:delete_all,:validate=>:false
end
Aqusepuedeobservarcomoencasoqueseborreuncliente,seborrantodassusfacturas
asociadas.Finalizaeldocumento,mencionandoquesidetodasmanerasdesea
implementarintegridadreferencialaniveldebasededatos,recomiendausar
http://github.com/harukizaemon/redhillonrails/tree/master/foreign_key_migrations/
EnelREADMEdeestagemaseexplicacomogenerardesdelasmigracionesclavesajenas,
coninstruccionesondelete,onupdate,etc.
Personalmentepudecomprobarlavalidezdeforeign_key_migrations,yaquesiempreme
hainquietadocompartirlabaseconprogramadoresquedesarrollenenotroslenguajes:la
basedeberaprotegerseasmismoanteregistroshurfanosoduplicados.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag122/197actualizadoal06/01/13
Estandoambastablascreadas,esunabuenaocasinparaversielmodelorespondea
nuestrasexpectativas.Tambinesunamuybuenaformaparadetectarerroresdediseo.
1.CreamosunaCompaaytomamosnotadesundice,creadoautomticamente.Por
ejemplo:3
2.CreamosunDepartamento,yenelcampocompany_id,fijamoselvalor3
3.CuandoqueremossaberaquecompaaperteneceunDepartamento,enlugarde
realizarun
SELECT companies.name
FROM companies, departments
WHERE companies.id = departments.companies_id
simplementeinstanciamosun
objetodetipoDepartament.Una
desuspropiedadesesla
Companyalaquepertenece.A
estoselellamaexpresarloen
formadeORM.
Sibienestospasoslospodemoshacer
creandocadaregistroenelSQLite
Manager,convieneaprendera
escribirloenformatoORM,yaqueaslo
expresaremoscuandoprogramemos
controladores.Paraellollamamosauna
versindelIRB(elinteractiveRuby)ya
precargadoconlaclaseActiveRecord
ysusherencias...nuestrosmodelos.
EstoseleconocecomolaRails
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag123/197actualizadoal06/01/13
Console.
Observaratentamenteel"chateo"conelmodelo.Podemosjugarasercontroladoresantes
desentarnosaprogramar.
AqupodemosverlospasosrealizadosenunRailsConsole.
Observarlasordenesintroducidas,comenzadascon>>
ObtenemoslaRailsConsoleenlarazdelproyecto,mediantelaorden
ruby script/rails console
rails console
Querido diario...
PorabajoestnocurriendolasverdaderastransaccionesSQL.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag124/197actualizadoal06/01/13
Enestacapturaseestutilizandotailmediantecygwinparaleerlatrazadelsistema,desde
elarchivolog/development.log
PuedeutilizarseensulugarTailXP,oelmismonotepaddeWindows,aunqueesteltimono
actualizaentiemporealloscambiosqueRailsvaescribiendosobreestearchivo.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag125/197actualizadoal06/01/13
Partials
Lospartialsseutilizanparaformulariosmuygrandes,endondeesmuylaboriosomantener
actualizadoslosmismoscampos(nombre,apellido,direccin,dni,cuit,edad,etc)encada
formularioNew,yencadaUpdate.
Simplementecreamosunarchivo"parcial",comnaambosarchivos,queesllamadoy
renderizadoenmediodelaejecucindeedit.html.erbydenew.html.erb.Lospartialllevan
unguinbajo"_"paraseridentificados.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag126/197actualizadoal06/01/13
Lapegamosenunarchivonuevo,ubicadoenapp/views/departments/quellamaremos
_form.html.erb
Elultimoprrafoquedice"Update"locambiamosporalgomasgenrico:"submit".
Yenapp/views/departments/edit.html.erb,lodejamosdelasiguientemanera:
<h1>Editing department</h1>
<%= render :partial => 'form' %>
<%= link_to 'Show', @department %> |
<%= link_to 'Back', departments_path %>
Probamossiandatodobien.Ahora,paraqueelformulario"New"sebeneficietambinde
cualquiercambioenelpartial,recuerdeactualizarapp/views/departments/new.html.erb
Yhablandodepartials,siprestaatencinalasalidadescaffold_controller,adiferenciade
scaffold,notarqueestescriptutilizapartials.Supongoquehaciendoincapienla
diferencia,porpropsitoseducativos.
Porcierto,scaffold_controllernogeneramigraciones(puestoquenocreamodelos)ni
agregarutasaconfig/routes.rb
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag127/197actualizadoal06/01/13
db/migrate
create
db/migrate/20100111170149_add_cuit_to_company.rb
Porcuriosidad,revisemoselarchivocreado:
*************************************************
class AddCuitToCompany < ActiveRecord::Migration
def self.up
add_column :companies, :cuit, :string
end
def self.down
remove_column :companies, :cuit
end
end
*************************************************
Corremoslamigracin,paraquesetomenloscambiosenlaestructuradelabase:
rake db:migrate
==
El problema
Sibienmodelosycontroladoresestnactualizados,lasvistasnoloestn,yporlotanto
seguirnmostrandoloscamposantiguos.As,tendremosquecrearmanualmentelos
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag128/197actualizadoal06/01/13
nuevoscampos,editandolasvistas.Sisomosvagos,yqueremosevitarestepaso,podemos
recurrirnuevamenteascaffold_controllerparamantenertodoactualizado:
Comosepuedeapreciar,selepasa
comoargumentoloscamposexistentes,
yelnuevocampo.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag129/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag130/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.95Betapag131/197actualizadoal06/01/13
ORM... de nuevo
Recordemos:entodoORM(ObjectRelationalMap),lasclasesmapeantablas,losatributos
aloscampos,losmtodosalasacciones,yunobjetopuedeserunregistroounacoleccin
deellos.
Abrimosunaconsolairbmedianteelcomando
rails console
ruby script/rails console
yprobamos
1.Crearunobjetodeptosquerepresenteunacoleccindetodoslosregistrosdisponibles
2.Loiteramos.Esdecir,lorecorremos,mostrandoconelcomandop(putsparaholgazanes).
deptos=Department.find(:all)
==> [#<Department id: 1, company_id: 1, name: "Secretaria Academica",
created_at: nil, updated_at: nil>, #<Department id: 2, company_id: 3,
name: "Maestranza", created_at: "2009-05-18 06:41:12", updated_at: "200905-18 06:41:12">]
Tambinlopodramoshaberrecorridoconunfor,undoloop,etc.Perohorrorizaraa
cualquierprogramadordeRuby.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag132/197actualizadoal06/01/13
Pararesolverdependenciasnecesarias:consultar
http://jacqueschirag.wordpress.com/2007/08/09/visualizeyourrailsdatabase
schemaforfreeonwindows
Paragenerarlosgrficossobremodelosycontroladores:
Oparagenerararchivospng:
railroad -M | dot -Tpng > modelos.png
Enlacarpeta,deberaaparecerundiagramadelosmodelosyotrodeloscontroladores.El
formatoes.svg,esdecirvectorialxml,formateableconcualquierherramientadedibujo
comoInkscape,CorelDraw,Ilustrator,etc,einclusouneditordetextos!
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag133/197actualizadoal06/01/13
Sepuedecambiarlacadenasvgporpng,masportable.Peroentantoquesvges
fcilmenteformateablemediantelosprogramasmencionados,losarchivospngrequieren
detodaclasedemaquillajeporpartedealgnprogramadeedicindefotos.
Sialgofalla,esporquenoestnbientrazadaslasrdenesbelongs_to,has_many,etc.
Parapodervisualizarlosdiagramasenformatosvg:
NotasrespectodeWindows:
InstalarpluginSVGdeAdobeparanavegadoresExploreryFirefox:
http://www.adobe.com/svg/viewer/install/
NotasrespectodeLinux:
Parasolamenteverlosarchivos
creados,sepuedellamar
simplementealpropioviewerde
imgenesdegnome(Ejemplo:
eog modelos.svg).
Paraeditar,agregarttulos,
etiquetas,comentarios,abrircon
inkscape(apt-get install
inkscape).
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag134/197actualizadoal06/01/13
Estrategia 2
AnnotateModels
Cuandoelproyectoavanzamucho,loscreadoresderailsrecomiendanutilizarunplugin
quesimplementevaanotandodentrodelosmodelos,loscamposquevamosutilizando.
Estosedebeaquecuandovaprogresandoelcdigo,recurrimosfrecuentementeal
modeloparacambiarcosas.Ytodoeltiempovamosalabasearevisarloscampos
existentes.Esunejercicioaburrido.
Ejemplodeinstalacin,directamentedesdelapginadesuscreadores:
sudo gem1.8 install annotate
Alternativamente:entrarahttp://github.com/ctran/annotate_models
Ahorasi:paradejaramanolosnombresdecampos,dentrodelosmodelos:
rake annotate_models
Annotating Company
Annotating Department
Siahoramiramosdentrodeapp\models\company.rb...magia!
#********************************************************************
# == Schema Information
# Table name: companies
#
#
id
:integer
name
:string(255)
address
:string(255)
active
:boolean
created_at :datetime
updated_at :datetime
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag135/197actualizadoal06/01/13
#*********************************************************************
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag136/197actualizadoal06/01/13
Captulo11
Captulo 11: Muchos a Muchos => Checkboxs
Esunhechoquesienunarelacindeunoamuchos,larepresentacinserunacaja
desplegableSELECT,(ounosRADIO),encambioenunarelacindemuchosamuchos,su
representacinsernlosCHECKBOX.
Railsescapazdemanejardevariasformaslasrelacionesmuchosamuchos.Aquveremos
laformamassimple,lahas_and_belongs_to_many.
Nuevamente...
Lapresenteexplicacintieneporpropsitointroducirsoloalosejemplosaqupresentados.
ParaverunamuycompletaguasobrelasrelacionesentrelosmodelosdeActiveRecord,se
recomiendaenfticamenteconcurriralaexcelenteguapresenteen
http://guides.rubyonrails.org/association_basics.html
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag137/197actualizadoal06/01/13
Supongamosqueenlacompaa,variosdepartamentoscolaboranpararesolveralgunos
proyectos.
Cargar departamentos
Estepasopuederealizarlomediantefixturesquetodavanovemos),cargardirectamente
usandoelManagerdeSQLite,omedianteelABMdedepartamentosquehabamoshecho
conRails,esdecir:
1. Lanceelserverdepruebas
rails server
2. Enhttp://localhost:3000/departmentscarguelosdepartamentos:
Estadsticas
RRHH
Auditora
Administracin
Mercadeo
Finanzas
Investigacin
Ventas
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag138/197actualizadoal06/01/13
Esdecir,deberateneralgoparecidoalacapturadepantalla:
3. Upps,enlaprimercolumna,enlaquediceCompany,figuraelcompany_idenlugar
delnombredelacompaa.Algoqueconotrosframeworkstardaramosunratoen
arreglar,conRailsestansimplecomo
Abrirapp/views/departments/index.html.erb
Cambiamoslalneaquedice
<td><%=h department.company_id %></td>
porotraquediga
<td><%=h department.company.name %></td>
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag139/197actualizadoal06/01/13
rake db:migrate
Enhttp://localhost:3000/projectscargamosdosproyectosconloscualesjugar:
Reducircostos
Identificarnichosdemercado
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag140/197actualizadoal06/01/13
Railstiendeacrearpornosotrosuncampoidparalapropiatabla.Sinembargo,eneste
caso,loevitaremos,yaquelosindices(masadelante)sernlasclavesajenasproject_idy
department_id.
Porestarazn,antesdemigrar,introduciremoslossiguientescambios(enrojo)enelarchivo
demigracindb/migrate/20100116190300_create_projects_departments.rb
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag141/197actualizadoal06/01/13
t.integer :department_id
t.timestamps
end
end
def self.down
drop_table :projects_departments
end
end
Ahorasi,corremoslamigracin:
rake db:migrate
==
-- create_table(:projects_departments, {:id=>false})
-> 0.0050s
==
Yenapp/models/project.rb
class Project < ActiveRecord::Base
has_and_belongs_to_many :departments
end
Controlar la relacin
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag142/197actualizadoal06/01/13
AlosprogramadoresdeRubylesgustamuchoprobarantesdeprogramar.Todavano
entramosarspec,cucumberyotrasherramientasparahaceralgoas,peroigualmente
podemosdescubrirerroresenlosModelosquehemosdiagramado,antesdeecharlela
culpaalosControladoresoalasVistas.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag143/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag144/197actualizadoal06/01/13
Enlarazdelaaplicacin,lanzamosunaversindeirbqueprecargalosmodelos,ylos
heredaconrespectoalasuperclaseActiveRecord.
rails console
rails console
Asignamosunproyectoparaquesearealizadopordeterminadosdepartamentos.Siun
proyectonoexistean,inclusolopodemoscrearaqu.
irb --> proyectoColas = Project.new
==> #<Project id: nil, name: nil, description: nil, created_at: nil,
updated_at: nil>
irb --> proyectoColas.name = 'Colas de espera'
==> "Colas de espera"
irb --> proyectoColas.description = 'Reducir colas de espera'
==> "Reducir colas de espera"
irb --> proyectoColas.save
==> true
irb --> proyectoColas.id
==> 5
Muybien!Hemoscreadounproyectomediantelaconsola,ysinusarSQLnilasvistas.
Fabriquemosotroproyecto.Soloporcuriosidad,realizaremostodaslasinstrucciones
anterioresusandosoloUNAlnea,utilizando.createenlugarde.new+.save
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag145/197actualizadoal06/01/13
01-18 04:03:23">
Yatenemosdosproyectos,quesesumanalosotrosdosquehabamoscargadodesde
http://localhost:3000/projects,recuerdan?eran:
Reducircostos
Identificarnichosdemercado
Podemosconstatarcuantosproyectostenemos,usandounfor(comoenelMdulo2:
Introduccin),omedianteuniterador.VamosausarelestiloRuby,eliterador.
Atencinalasnegritas:
puts p.name
>>
end
Reducir Costos
Identificar nichos de mercado
Colas de espera
Obsoletos
(un montn de otras cosas)
==>
Delamismaforma,podemosvercuantosdepartamentosfiguranenbase
irb --> Department.find(:all).each do |d|
\-+
puts d.name
>>
end
Estadsticas
RRHH
Auditora
Administracin
Mercadeo
Finanzas
Investigacin
Ventas
(un montn de otras cosas)
==>
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag146/197actualizadoal06/01/13
Ejercicio:enelproyecto"Colasdeespera",cuyoobjetoinstanciadoesproyectoColas,se
deberaninvolucrartodosaquellosdepartamentosdondeseproducenlargasesperasde
personas.EstossonlosdepartamentosVentasyAdministracin.
Instanciemoscomounobjetollamadoventas,quereferencieaquelregistroqueposeael
departamentoVentas.Siconocemossuid,podemosusar:
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:
BusquemosAdministracin,yasignemostambinaColas:
irb --> adm = Department.find(:all, :conditions => " name like '%Administrac%' ")
==> [#<Department id: 6, company_id: 1, name: "Administracin ", created_at:
"2010-01-16 18:20:53", updated_at: "2010-01-16 18:20:53">]
irb --> proyectoColas.departments << adm
==> [#<Department id: 10, company_id: 1, name: "Ventas ", created_at: "201001-16 18:22:18", updated_at: "2010-01-16 18:22:18">, #<Department id: 6,
company_id: 1, name: "Administracin ", created_at: "2010-01-16 18:20:53",
updated_at: "2010-01-16 18:20:53">]
VeamoscuantosdepartamentosseencuentranasignadosalproyectoColas.
irb --> proyectoColas.departments.count
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag147/197actualizadoal06/01/13
==> 2
Cules?
irb --> proyectoColas.departments
==> [#<Department id: 10, company_id: 1, name: "Ventas ", created_at: "201001-16 18:22:18", updated_at: "2010-01-16 18:22:18">, #<Department id: 6,
company_id: 1, name: "Administracin ", created_at: "2010-01-16 18:20:53",
updated_at: "2010-01-16 18:20:53">]
O,mejorpresentado:
irb --> proyectoColas.departments.each do |x|
\-+
puts x.name
>>
end
Ventas
Administracin
(yunmontndebasura)
HIRB
Realmentelasalidareciente
irb proyectoColas.departments
==> [#<Department id: 10, company_id: 1, name: "Ventas ", created_at: "201001-16 18:22:18", updated_at: "2010-01-16 18:22:18">, #<Department id: 6,
company_id: 1, name: "Administracin ", created_at: "2010-01-16 18:20:53",
updated_at: "2010-01-16 18:20:53">]
sevebastantedesordenada.Enregistrosconmuchoscamposcuestaencontrarlas
cosas.MejoraremosunpocolapresentacinmedianteunpluginllamadoHIRB.
BajoUbuntuyRails3,instalamoselpluginmediante:
gem install hirb
sudo gem1.8 install hirb
Luegoagregamoslassiguienteslneasanuestroarchivo$HOME/.irbrc
Estascargarnhirbencadallamadaairb,yconsecuentementearailsconsole:
require 'rubygems'
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag148/197actualizadoal06/01/13
require 'hirb'
extend Hirb::Console
Hirb::View.enable
Pruebenlasiguientecombinacin:
rails console
ruby script\console
irb(main):001:0> table ['pepe', 'pipa']
+-------+
| value |
+-------+
| pepe
| pipa
+-------+
2 rows in set
=> true
SitenemosproblemasdeinstalacinbajoWindows,alternativamentepodemosseguirlas
instrucciones"oficiales"quefiguranenladocumentacindelproyecto,yutilizarelinstalador
depluginspropiodeRails3,elcualpermitellegarhastaelmismocorazndelproyecto,y
obtenerlaultimaversinposible.EstepasorequieredetenerGITinstalado.
ruby script/rails plugin install git://github.com/cldwalker/hirb.git
Luego,abrimosunconsolayescribimos.
rails console
irb(main):001:0> require 'hirb'
irb(main):002:0> extend Hirb::Console
irb(main):003:0> Hirb::View.enable
Comentariotilrespectodeplugins:
Sitieneproblemasinstalandoplugins,ynoestasegurosilaconfiguracindeRuby+Railses
compatible,visitehttp://railsplugins.org.Allencontrarunlistadodepluginstesteados
comoestables,esdecir,que"deberanfuncionar".
FIXME:PresentaraquelmismoejemploproyectoColas.departmentsconhirb
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag149/197actualizadoal06/01/13
Ejercicios propuestos
1) Asignaralproyecto"Reducircostos",losdepartamentosdeEstadsticas,RRHH,
Auditora,Administracin,MercadeoyFinanzas.
2) Asignaralrevs:InscribiraldepartamentoInvestigacinenlosproyectos"Identificar
nichosdemercado",y"Obsoletos"
Elcdigodelparcialeselsiguiente:
<%= error_messages_for 'department' %>
<!--[form:department]-->
<div>
<p>
<%= f.label :name %><br/>
<%= f.text_field 'name'
</p><p>
%>
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag150/197actualizadoal06/01/13
Cambios en el controlador
Enapp/controllers/departments_controller.rb,alprincipiodelaaccinupdate(laque
recibelosvaloresdelavistaedit),paraevitarelproblemacitadoen
http://asciicasts.com/episodes/17habtmcheckboxesrespectodecuandoningn
checkboxhasidoclickeado,hayqueponeresto:
params[:department][:project_ids] ||= []
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag151/197actualizadoal06/01/13
Y el show? (yapa!)
Lasvistasshownoposeencheckbox,locualeslgico,puestoquenoseenviarndatos.
Peroseratilpodervisualizarenmodo"sololectura"aquellosproyectosenlosquese
encuentraanotadoeldepartamento.Paraellomodificamos
app/views/departments/show.html.erbparaquequedemejorpresentado:
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag152/197actualizadoal06/01/13
<p>
<b>Company:</b>
<%=h @department.company.name %>
</p>
<p>
<b>Department:</b>
<%=h @department.name %>
</p>
<p>
Proyectos relacionados
</p>
<ul>
<% @department.projects.each do |project| %>
<li><%= project.name %> - <%= project.description %></li>
<% end %>
</ul>
<%= link_to 'Edit', edit_department_path(@department) %> |
<%= link_to 'Back', departments_path %>
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag153/197actualizadoal06/01/13
AlprincipiohabamoshabladounpocodeMVC.Sinembargo,noesunconceptofcilde
abstraer.Ademas,losscaffoldtiendenamalacostumbrar,demodoquevamosatrabajar
unpocoamano.
Escomnquelaslasaplicacionessedividanenelfrenteo"frontend",yenlatrastiendao
"backend".Esunanglicismoqueseexplicaporsisolo,ytilparaejemplificaraqu.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag154/197actualizadoal06/01/13
Comenzaremosgenerandouncontrolador"frontend"conunaaccin"activas"adentro.Su
funcinsermostraraquellossoloregistrosdecompaasquetengansucampoactive
comotrue.
Esdecir,haremosnuestrapropiaversindelABMdecompanies:
Comoapareceenlacaptura,intentaremossepararvisualmentelasempresassegnsu
campoactive.Tambinlehabilitaremosunbotnalusuarioparaquecambiefcilmenteel
estado,conunsoloclick.Lorealizaremossinusarscaffolds(19):
Usaremosungeneradordecontroladores,cuyousoes
rails generate controller controlador accin1 accin2 accin3
ruby script\rails generate controller controlador accin1 accin2 accin3
Porlotanto,utilizamoslaorden
rails generate controller frontend activas
ruby script\rails generate controller frontend activas
exists
app/controllers/
exists
app/helpers/
exists
app/views/frontend
exists
test/functional/
exists
test/unit/helpers/
create
app/controllers/frontend_controller.rb
create
test/functional/frontend_controller_test.rb
create
app/helpers/frontend_helper.rb
create
test/unit/helpers/frontend_helper_test.rb
create app/views/frontend/activas.html.erb
Siobservamosatentamente,paralelaalaaccinsehacreadounavistaconelmismo
nombre.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag155/197actualizadoal06/01/13
http://localhost:3000/frontend/activas,debemosmencionarloenconfig/routes.rb
map.resources :activas
La Vista
Realizaremosdosdivisiones<div>queocupencadaunalamitaddelapantalla.Estoes
muysimple,ylorealizamosmediantelainclusindecssdentrodel<div>.Alsertan
localizadalanecesidad,puedeperdonarmenomandarheight:50%alarchivo
general.css,yemplearlodirectamenteusandoelmodificadorstyle.
Tambinlepondremosunasimplelneainferioralacajasuperiorparasepararambas.Esto
selograconborderbottom:solid;
Enlugardelosenlaces,usaremosdosbotones:up.png
ydown.png
Encadaunodelos<div>usaremosbuclesmuyparecidos:
y
<% Company.find(:all, :conditions => {:active => false}).each do |c| %>
SirecuerdanelMdulo2:Introduccin,recordarnquelosprogramadoresdeRubygustan
deusariteradores.Enelejemploiteraremoscrearemosymataremosmuchasvecesun
objetoc,queposeetodoslosdatosdelregistro.
Dentrodelosbucles,usaremoslafuncinlink_to,lacualpuedeempleartodaclasede
parmetros.Paranuestrasnecesidadeslesuministraremos:
1. Algoparamostraryconvertirenunenlace:unapalabra,ounaimagen.Las
imgenespuedenvincularsemedianteotrafuncin,image_tag.
2. Datosparaconformarelenlace:enldebemosespecificar
1. Controladorhaciadondevanlosdatos
2. Accinagestionareldato
3. ElIDdelregistroamostrar
3. Confirmacin
Todosestosparmetrospuedenanidarseusandollaves{}
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag156/197actualizadoal06/01/13
Ahoras:copiemoselsiguientecdigodentrodeapp/views/frontend/activas.html.erb
<div id="arriba" style="border-bottom:solid; 1px; height: 50%">
Empresas Activas
<ul>
<% Company.find(:all, :conditions => {:active => true}).each do |c| %>
<li>
<%= h c.name %>
<%= link_to(image_tag("/images/down.png" ),
{ :controller => "frontend",
:action => "activas",
:id => c
}, {
:confirm => "Est seguro?",
}
)
%>
</li>
<% end %>
</ul>
</div>
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag157/197actualizadoal06/01/13
</ul>
</div>
El Controlador
Elarchivoapp/controllers/frontend_controller.rbcontendr:
class FrontendController < ApplicationController
def activas
if params[:id]
modificar = Company.find(params[:id])
if modificar.active == true
@modificar.active = false
else
modificar.active = true
end
modificar.save
end
end
end
Enestecontroladorrecibimoselid(recuerdanaliteradorc?).Partimosdelasiguienteidea:
siacabandearribardatosdesdelavista(verifparams[:id]),esporqueeloperadorha
hechoclickenalgnenlace.Enestecaso,en
oen
,yporlotanto,deseael
estadodecampotrueporfalse,ofalseportrue.
Primerobuscamosunregistroconese:id,yloinstanciamosenunobjetomodificar
modificar = Company.find(params[:id])
Luegomodificamosenmemoriasucampo
modificar.active=falseomodificar.active=true
yluegologuardamos.
modificar.save
Lavistasedisparaautomticamentecuandolaaccinterminasuejecucin.Mostrando
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag158/197actualizadoal06/01/13
comolaempresacambiaentrecajas<div>
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag159/197actualizadoal06/01/13
Captulo12
Server de Produccin
Siseobservaenconfig/databases.yml,severnunaslneasquecorrespondenalabasede
datosqueefectivamentevenlosusuarios.
Enestearchivo,sepuedenapreciartresentornosdetrabajo:development,testingy
production.Cadaunadeestasinstanciassecorrespondendesupropiabase,lascuales
puedeninclusoresidirendistintosmotores.
Deestamanera,yattulodeejemplo,podemosrealizarnuestraspruebasydesarrollosen
ellivianoSQLite;cuandoconsideramosestablesloscambios,losaplicamosenlabase
produccin,donderesideunMySQL,Oracle,MSSQL,PostgreSQL,etc.
Entrminosgenerales,elciclodevidadeundesarrolladorRailsjunioreselsiguiente.
1) Trabajaenmododevelopment
2) Cuandoconsideraquelaaplicacinseencuentraestable,haceunacopiadela
mismaaunacarpetadistinta.
3) Sobrelasegundacarpetacreadaatalpropsito(siusaSQLiteinclusopara
produccin),correlasmigracionesenmodoproduccin.Esdecir,realizaun
rake db:migrate RAILS_ENV="production"
4) ConfiguraApacheparaquesirvalaversinenproduccindesdeestaltima
carpeta.Esdecir,publica.
5) ConfigurasuWindowsparaqueresuelvaelnombredelaaplicacincomolocal.
6) DejainstaladosApachey(Mongrel+AplicacinDemo)comoserviciosdeWindows.
Estoesmuytil,puestoquesidesealiberarciclosdeCPUparacorrerunjuegodeRol,
puededetenerestosservicios.
Veremosmasadelantecomorealizarestepaso,esdecir,configurarelequipoalestilo
deunserverUnix.
EntantoqueundesarrolladorSeniorprobablementerealicelossiguientespasos:
1) Estableceunrepositoriopropio,normalmenteGIToSVN.
2) Trabajaenmododevelopment.
3) Testea:
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag160/197actualizadoal06/01/13
1. Seaseguradetenerfixtures.Porejemplo,sitieneunatablacon4campos,se
aseguradetenerdatosficticiosqueseancargadosporunscriptautomtico
duranteeltesting.
2. Correuncomandoqueseencargadelimpiarlabasetesting,ylareconstruye
(vaca)basadaenlabasedevelopment.
3. Otroscriptcargatodoslosformulariosutilizandolosdatosdelosfixtures,alavez
quepruebaelcdigo.
Eltesteoesmuytilparalasocasionesenquecambiosenalgunapartedela
estructura"ofende"aotrosformularioscuyaestabilidaddamospordescontada.
Estopermitesuperarelengorrodeprobartodalaaplicacincadavez.No
obstante,noesobligatoriotestearenRails.
4) Sipasaloserrores,esdecir,losfixturessecarganexitosamenteenlabasetesting,
informamediantecommitsalrepositoriolocal.Esterepositoriolepermitemantener
variasramasdedesarrollo,einclusorealizarrollbacksentreellas.
5) Invitaaclienteaquepruebeloscambios(:3000)
6) Enelserverdeproduccin,pidequeseconfigureGIT,ApacheyPassenger.Esdecir,
dejaalBOFHacargorascndoselacabeza(20),ylohaceelmismoprogramador.Por
suerte,lamayoradeloshostingsconCPANELactualizadoyatraenconfigurados
estosdaemons.
7) UtilizaalgnscriptautomticocomoCapistrano,queseencargade
1. SubirlaramadedesarrollovaGIToSVN.
2. Clonar(dentrodelserverdeproduccin)lanuevaversindelaaplicacin,enuna
carpetaconfiguradaparaserservidaporApache.
3. Correrlamigracinsobrelabasedeproduccin.
Hastaahorahemostrabajadoenelpuerto3000,conunpequeoservidordepruebas
llamadoWebrick(oMongrel,siseencuentrapresente).Puedenadivinarlarazn:hemos
dejadolibreelpuerto80paralainstanciaproductiondenuestrosistema.Afinesdidcticos,
enfocaremoslasdosformasclsicas:proxyymdulo.
Enlaprimerforma,yparanuestroejemploconWindows,elpuerto80logestionar
Apache,quienescapazdegestionarmilesdeconsultasensimultaneo,yalavez
parsearlasalasdistintasaplicacionesRailsqueconvivanenelmismoequipo.
20 BastardOperatorfromHell.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag161/197actualizadoal06/01/13
Enestasaplicaciones,seencontrarescuchandounpequeoservidorllamado
Mongrel.Medianteunmecanismodeproxy,Apacherealizarlasconsultasa
Mongrel,yseguardaraquellasqueseanfrecuentes.
Estosuponelidiarconalgunasconfiguracionesextras,peronosbeneficiaremosdelas
ventajasdevelocidadquesuponeintercalarunsistemadecachedeconsultas
frecuentes.
BajoLinux,realizaremoslainstalacinmedianteunmodrailsllamadoPhusion
Passenger,elcualdesgraciadamentenoexisteparaWindows.Esunprocedimiento
simple,acordealoscmodosyconfiablesmdulosquelosviejosBOFHacostumbran
aenchufarenApache(21).
Discusin:Linux,Windows,ounCluster?
Sediceque"enLinuxesdifcilhacermuchascosas".Sinembargo,estonoesdeltodo
cierto.Linuxparecehabersidoconstruidoparahacerfcilmentemuchascosasqueen
Windowssondifciles.Estassonsonactividadesquelosusuariosfinalesnohacenamenudo,
yporlotantonoaprecian.
Meexplico,instalarproxys,basesdedatos,daemonsdeversionado,agentesdeacceso
remoto,servidoresweb,debackupodecorreo,sonasuntostriviales,rpidosygratisbajoel
sistemaoperativodelpinginito.
Porestarazn,setiendeatrabajarconlasbasesdevelopmentytestingbajoWindows(o
MACOS/X),yadesplegarlabaseproductionsobreLinux.
LomismosucedeenelmundodePHP.UsualmentelosprogramadoresdePHPpruebanen
Windows,ydeployanenLinuxremotos,contratadosmedianteplanesdehosting.
As,muchosrubystasconsideranqueinstalarunserverenproduccindeRailsenWindows
esmuydifcil,alavezqueinseguro,porlanaturalezamismadeWindows.Intentaremosaqu
demostrarlocontrario(22).
Dejandoclarolosprimerosconceptossobrepublicacin,animaranuestroslectores
palmpedosaquepruebenlarapidezysencillezconlaqueseconfiguraunservicio
equivalentesobreLinux.
21 Enesencia,losadministradoresdeLinux,son(somos)unosvagos.LarazndeaprenderaadministrarLinux...
estenertiempolibredentrodelaempresa.
22 DemostraremosquenoesdifcilmontarunserverdeproduccinenWindows.Noqueseaseguro.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag162/197actualizadoal06/01/13
Finalmente,sinodeseamoscomplicarnosdemasiado,opredecimosunaaltacargasobre
elsistema,veremoscomodesplegarhaciauncloud.Estaformadetrabajaresmuy
cmoda,yaquesepagasolamenteloconsumido,yalavezcontamosconalgunas
comodidadesmuyinteresantes.
Preparar Base
1) Comoprimerpaso,copiamoslaaplicacinhaciaotracarpetaquedebeestar
destinadaaproduccin,porejemplo
C:\InstantRails-2.0-win\rails_apps\demo-production
Atenerencuenta:siseencuentrausandoSQLite,yenlacarpetadestinoexisteun
archivodb\production.sqlite3,nolosobrescriba.
2) Enlanuevacarpeta,corremosuncomandoquenospermitecrearlabasede
produccinsiestanoexistiera,orealizarlecambiosensuestructura.Estoscambiosse
correspondenaaquellosquehemosrealizadosobrelabasedevelopment.
Aviso:amenosquerealicenpermanentestestsobrelasmigraciones,hagaun
backupdelabasedeproduccin.EnelcasodeSQLite,estansimplecomoponera
buenrecaudoelarchivodb\production.sqlite3
Atalfin,realiceun
rake db:migrate RAILS_ENV="production"
Estecomandorealizarlassiguientesacciones
Silabaseproductionnoexiste,rakecrearaunaversinvaca,basadaenla
estructuradelabasedevelopment.
Silabaseexiste,modificarsuestructura,aplicandolasmigraciones
pertinentes.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag163/197actualizadoal06/01/13
Siexaminanconcuidadolalneaderdenes,Mongrelatenderestaaplicacinenel
puerto4000.OtrasaplicacionesquerealicemosconRailsdeberanllevarotronmerode
puerto.
Podemosiniciarelserviciodedosmaneras:
PorMSDOS
net start demo
MediantelaConsoladeAdministracindeWindows
DeberamosveraMongrelenproduccin,siapuntamoselnavegadora
http://127.0.0.1:4000
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag164/197actualizadoal06/01/13
Porcierto:enlaConsoladeAdministracindeberamosdejarcorriendotantolaaplicacin
demo,comoApache;cadavezqueinicielacomputadora.Reviselaspropiedadesde
ambosservicios,ycomoapareceenlasiguientecaptura,actveloscomo"Automtico".
Configurar Apache
Hastaaqutenemoslaaplicacin
listaparaserviralosusuarios.Sin
embargo,habamosmencionado
queporrazonesdecargay
estabilidad,esconvenienteponer
adelantedeMongrelalviejo,
grunyconfiableApache.Bajo
InstantRailselprocedimientoes
muysencillo:
Debemosabrirc:\InstantRails2.0
win\conf_files\httpd.confy
agregaralfinallassiguientes
lneas:
<VirtualHost *>
ServerName demo
ProxyPass / http://localhost:4000/
ProxyPassReverse / http://localhost:4000
</VirtualHost>
RestaqueApachequedecomoservicio(cuidadoconlaruta)
C:\InstantRails-2.0-win\apache>apache -k install
Installing the Apache service
The Apache service has been installed successfully.
Podemosprobarloentrandoahttp://127.0.0.1
nimo,faltapoco!
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag165/197actualizadoal06/01/13
Finalmente,anivellocal,deberamosagregaralarchivo
C:\WINDOWS\SYSTEM32\DRIVERS\ETC\HOSTS,unalneaparecidaaalasiguiente
127.0.0.1
SideseamosquelasotrascomputadorasdelaLANveannuestraaplicacin,deberamos,o
bienconfigurarunCacheDNSlocal(23),oalterarelarchivohostsdecadamaquina,
agregando(nocambiando)lasiguientelnea.
192.168.1.33
demo
Siadivinan,estalineaapuntarreferenciasdeltipo"http://demo"hacialaipdela
computadoraqueseencuentrasirviendo.Enelejemplo:192.168.1.33
Errores
Siobtenemoserrores:
DebemosasegurarnosefectivamenteenlaConsoladeAdministracindeWindows
(InicioEjecutarservices.msc)quetantolaaplicacindemocomoApachese
encuentraniniciados.Sialteramosalgunodelosarchivosdeconfiguracin,
deberamosreiniciarpreventivamenteestosservicios.
23 LospasosparainstalarunCacheDNSbajoLinuxpuedeconsultarlosenelManualdeRedesLibres,del
mismoautor,enladireccinhttp://www.bunker.org.ar/incubadora/redes.pdf
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag166/197actualizadoal06/01/13
3) SiobtenemosunerrorGET,elproblemaocurrecuandoApacheinterrogaaMongrel,
elcualpodraestardetenido,ofuncionarmal.Podemosprobarcomoest
funcionandoelmodoproduccin,conbaseytodo.
ruby script\server --environment="production"
Sielpuerto3000yaseencuentraocupadopornuestrainstanciadedevelopment,
puedepasarascript\serverelparmetrop(otropuerto).Siobtenemosunerror
"desconocido",deberamosrevisarelarchivolog\production.logenbuscade
problemas.Estearchivo,sibienpuedeserabiertoporcualquiereditor,nodebemos
olvidarquetodoeltiempoesalteradoporMongrel,demodoquesideseamostener
unavista"entiemporeal"delaaplicacin,deberamosobtenerunequivalenteal
comandotailfdeLinux.ParaWindowspodemosrecurrira
http://tailforwin32.sourceforge.net
Recuerdequenotodosloserroressurgenanteelnavegador.Porrazonesdeseguridad,solo
sevuelcanalarchivodelogparaserrevisadosporeladministrador.
Encasoquedeseedesbloquearciertoserrores,leaconsejoreviseeldocumento
http://guides.rubyonrails.org/debugging_rails_applications.html
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag167/197actualizadoal06/01/13
Links recomendados:
http://mongrel.rubyforge.org
http://mongrel.rubyforge.org/wiki/Win32
sudo apt-get
(unmontnderesultados)
AcontinuacininstalamosPassenger,elcualnospedirquerealicemosmanualmente
algunospasos.Tambinnosrecordarlaimportanciadeaprenderlaformaenquerazona
Apache.
s@mandragora:~$ sudo gem install -r passenger
Building native extensions.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag168/197actualizadoal06/01/13
Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.
Press Enter to continue, or Ctrl-C to abort.
-------------------------------------------Checking for required software...
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag169/197actualizadoal06/01/13
configuration!
Siprestamosatencin,veremosqueelscriptnosexplicaquedebemosquedebemos
agregaralgunaslineasenelarchivodeconfiguracindeApache.Talcomoserecomienda
enlaexcelenteobraAgileWebDevelopmentwithRails3ed,Captulo"InstallingPassenger",
buscamoselarchivodeconfiguracindeApache.Estearchivopuedediferirsegnla
versindeLinux,UnixoWindowsqueestemosusando.
s@mandragora:~$ apache2ctl -V | grep SERVER_CONFIG_FILE
-D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"
EnelcasodeUbuntuyDebian,elarchivoamodificares/etc/apache2/apache2.conf
Perosigamosleyendoquemasnosdiceelscriptdeinstalacin.
VirtualHosts
Elscriptdeinstalacinnoquierodejardecomentarlaimportanciadeconfigurarlos
VirtualHosts(24).
Paracomenzar,enelarchivo/etc/apache2/apache2.conf,buscamoslassiguienteslneas,y
lasdejamosdelasiguientemanera:
NameVirtualHost *:80
Include /etc/apache2/sites-enabled/
Aquestamosindicando,enprimerlugar,queesteservidornoatiendeunasolaaplicacin,
sinovarias.Comosegundamedida,habilitamoselnewstylequetienelosadministradores
Linux(noWindows,noUnix)derepartirlaconfiguracindecadaaplicacinenunarchivo
distinto.Estoestilparanosobrecargarnimezclartemsenelarchivohttpd.conf,oel
apache2.conf
Luego,usandoelsudopower,creamosunarchivodemo,enlaruta/etc/apache2/sites
available,cuyocontenidoserequivalentea
24 Laexpresin"VirtualHost"hacereferenciaalacapacidaddeApache,deservirvarioshosts,talescomo
http://pachanga.com,http://vivalapepa.org.ar,http://demo,etc,sobreunamismamaquina,esdecir,
sobreunmismohost.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag170/197actualizadoal06/01/13
<VirtualHost *:80>
ServerName demo
#Estamos trabajando en entorno de produccin, pero si deseamos otro entorno:
#RailsEnv development
DocumentRoot /home/s/demo/public
<Directory /home/s/demo/public>
AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>
Estenewstyledeconfigurarunarchivoporcadaaplicacin,seraimposibledereproducir
enWindows,debidoaNTFScarecedelacapacidaddeconstruirlinkssimblicos.Estos
elementosseparecenalosaccesosdirectos,conladiferenciaqueloslinkssimblicos
puedenserseguidosporprogramas.Apachepuedeseguirunlinkhastasuubicacinfinal,
comosiestefueraelarchivooriginal.
Paraserexacto,nuestroarchivodemo,queseencuentraen/etc/apache2/sitesavailable,
deberaservinculadohaciaunacarpetaubicadaen/etc/apache2/sitesenabled
Sibienpodemoshacerestepasoenformamanual,esdecir
ln -s /etc/apache2/sites-available/demo /etc/apache2/sites-enabled/demo
Podemosutilizarencambio,uncomandodeApache2,muchomasseguro:
s@mandragora:/etc/apache2$ sudo a2ensite demo
Site demo installed; run /etc/init.d/apache2 reload to enable.
s@mandragora:/etc/apache2$ sudo /etc/init.d/apache2 reload
Reloading web server config apache2
Algunos mensajes... controlar solamente el [OK]
Porcuriosidad,sicorremoselsiguientecomando
s@mandragora:/etc/apache2$ ls -l /etc/apache2/sites-enabled/
lrwxrwxrwx 1 root root 33 2010-02-11 22:18 demo -> /etc/apache2/sitesavailable/demo
Podremosverqueelarchivo/etc/apache2/sitesavailable/demoposeeunaccesodirecto
queloapuntadesde/etc/apache2/sitesenabled/
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag171/197actualizadoal06/01/13
Siahoraprobamoscargarenelnavegadorlasdirecciones
http://127.0.1.1/ohttp://127.0.0.1/
Deberamosverlaaplicacincorriendo.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag172/197actualizadoal06/01/13
Multihosting
SupongamosquetenemosotraaplicacinRailsenelmismoservidor.Lallamaremos
Pasantes(esunodemisproyectos,paraadministrarpasantas).Lacrearemos,naturalmente,
medianteelcomando
s@mandragora:~$railspasantes
Aligualquecondemo,generamosunarchivopasantesen/etc/apache2/sitesavailable
Sucontenidoesunacopiamuyparecidaalarchivodemo,presenteenlamismacarpeta.
<VirtualHost *:80>
ServerName pasantes
#Estamos trabajando en entorno de produccin, pero si deseamos otro entorno:
#RailsEnv development
DocumentRoot /home/s/pasantes/public
<Directory /home/s/pasantes/public>
AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>
Lohabilitamoscon
s@mandragora:$ sudo a2ensite pasantes
Site pasantes installed; run /etc/init.d/apache2 reload to enable.
s@mandragora:$ sudo /etc/init.d/apache2 reload
Yestaparteesnueva:enelarchivo/etc/hostsnosaseguramosquelapilaTCP,
concretamenteaquellaqueresuelvenombres,hagaa127.0.0.1lassolicitudesdenuestras
aplicaciones:
127.0.0.1 localhost demo pasantes
127.0.1.1 mandragora demo pasantes
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag173/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag174/197actualizadoal06/01/13
GitHub o Heroku?
Anoconfundir:anivelgratuito
HerokuofrecehostingyalgunosrudimentosdeGIT.
GITHUBnoincluyehosting,peroacambioofrecemuchasopcionesparagestionarun
proyectocolaborativo,ysinlimitesdetamao.
EnrealidadlarespuestaesGitHubyHeroku:GITescapazderegarcdigoenambos
serviciosmedianteelcomandopush.
Paraelsiguienteejemplo,haremosusodelserviciogratuitodeHeroku.Encasoque
necesitemosmas"traccindehosting",siemprepodremoscontratarallserviciosextras
comoDynosoWorkers.Sinecesitamosmaspotenciadegestindeproyecto,
paralelamentepodemosusargithub,configurndolocomofiguraen
http://teachmetocode.com/screencasts/gettingstartedwithgithub
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag175/197actualizadoal06/01/13
Generamosunconjuntodellaves(yenWindows?):
s@mandragora:~/demo$ ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ''
s@mandragora:~/demo$ ssh-keygen -t dsa -f ~/.ssh/id_rsa -N ''
s@mandragora:~/demo$ heroku keys:add
Found the following SSH public keys:
1) id_dsa.pub
2) id_rsa.pub
Which would you like to use with your Heroku account? 1
Uploading SSH public key /home/s/.ssh/id_dsa.pub
CreamosunproyectodentrodeHeroku
s@mandragora:~/demo$ heroku create demo
Enter your Heroku credentials.
Email: "escuelaint@gmail.com"
Password:
Uploading ssh public key /home/s/.ssh/id_rsa.pub
Creating demo.... done
Created http://demo.heroku.com/ | git@heroku.com:demo.git
Sinolohemoshecho,pedimosagitqueseinstalesurboldecambios
s@alcaudon:~/Escritorio/Proyectos/demo$ git init .
Sinolohemoshecho,configuramosusuarioycorreo
s@mandragora:~/demo$ git remote add heroku git@heroku.com:demo.git
Enrealidad,laordengitremoteaddagregapornosotrosensuarchivo.git/configuna
seccinquereza:
[remote "heroku"]
url = git@heroku.com:demo.git
fetch = +refs/heads/*:refs/remotes/heroku/*
Configuramosalgunosvaloresmas
s@mandragora:~/demo$ git config --global user.name "Sergio Alonso"
s@mandragora:~/demo$ git config --global user.email "escuelaint@gmail.com"
s@mandragora:~/demo$ git config --global color.ui "auto"
Antesdehacerelpushhaciaheroku,nosaseguramosdehaberentregadolocalmente
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag176/197actualizadoal06/01/13
todosloscambios
git add .
git commit -a
Ahorasi,subimoslaaplicacin.
s@mandragora:~/demo$ git push heroku master
Tcnicamente,todoestalistoparaencontrarnuestraaplicacincorriendoen
http://(nuestraaplicacin).heroku.com
Sinembargo,estodispararunerrorenlaversinonline,puestoquefaltasubirlabase.Ya
habamencionadoquelosproyectosrails3normalmentetraenunarchivoenlaraz
llamado.gitignore,quesirveparaquedurantelospushnosesubanciertosarchivosy
carpetas.Simiramosnuestroarchivo.gitignore,encontraremosquenuestrabasededatos...
probablementenohasubido:
.bundle
db/*.sqlite3
log/*.log
tmp/**/*
Lamaneraobviadepermitirsubiralabasedevelopment.sqlite3aproduccinseraquitar
db/*.sqlite3de.gitignore,perosiunosedetieneapensarlo,locoherenteseracorrerlas
migracionessobrepostgresql,aligualqueheroku,elcualsindudadebeestarmuy
optimizado,puestoquesirvedecenasdemilesdeaplicacionesporsegundo.Igual,nohay
quepreocuparseconesto,porqueactiverecordnosdaindependenciarespectodela
basequeseusaenproduccin(podriahabersidomongodbuotracosa).
Lalneadb/*.sqlite3existepordefectoporsiutilizamossqlitetambinenelserverde
produccin,ynoqueremossobrescribirconverduralosdatosqueendefinitiva,nosestn
dandodecomer.
Siestamossegurosdenosobrescribirdatosimportantes,ytenemoslagemataps,podemos
quitaresalnea,yempujarlabaseentera,conmigracionesytodo:
s@mandragora:~/demo$ heroku db:push
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag177/197actualizadoal06/01/13
Ahorasi,aprobarlaaplicacin.Recuerdeejecutarherokulogsencasodeerroresdurante
eldeploy.
Noolvidarsituarseenalgunacarpetadondealojemosnuestrosproyectos,y...
s@mandragora:~$ git clone git@heroku.com:demo.git
Entramosalproyecto,ponemosalgoquenoestabaantes...
s@mandragora:~$ cd demo
s@mandragora:~/demo$ touch archivo_nuevo
TouchnoexisteenWindows:solofabriqueunarchivoenblanco.
Ponemosaldaelrepositoriolocal,explicamoslanovedad...
s@mandragora:~/demo$ git add .
s@mandragora:~/demo$ git commit -a -m "un archivo nuevo"
Sitenemosmasdeunrepositoriodonderealizarnuestraentregas,comoheroku,yalavez
github,aveces,antesderealizarelpushpordefecto(origintomaster)convienerevisarlas
entradasexistentesen.git/config.
Puedeserquehayamosalteradolaestructuradelastablas,agregadooborradocosas.En
talcaso,sincronizamos
s@mandragora:~/demo$ heroku rake db:migrate
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag178/197actualizadoal06/01/13
Ysubimosnuestroscambiosalrepositorioconfiguradopordefecto.
s@mandragora:~/demo$ git push origin master
O,sitenemosmasdeunrepositorioconfiguradoen.git/config,comogithub,especificamos
herokucomodestino
s@mandragora:~/demo$ git push heroku master
Siademsqueremosbajarlabaseconlosdatosenproduccin,sobreescribiendola
nuestraendevelopment,parabackupear,desarrollarotestearcondatosreales(loquese
conocecomohacerelrestoredelabase),podemoshacerun
s@mandragora:~/demo$ heroku db:pull
Receiving schema
Receiving data
n tables, m records
users:
00:00:00
pages:
00:00:00
comments:
00:00:00
tags:
00:00:00
Receiving indexes
Resetting sequences
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag179/197actualizadoal06/01/13
ApndiceA
Ayuda!
NoquieroexplicarlecomobuscarinformacinenInternet.Peroesposiblequehayaestado
buscandoenelsitioerrneo.Veamosalgunastcnicasparaencontrarrpidamenteel
error.Paraempezar,debemostenerclaroelerror:
Debuggear en Ruby
Cuandounprogramanohaceloquedebe,siempretenemoslaopcindeinspeccionarlo.
Losprogramasescritosenruby(archivos.rb)seinspeccionanmedianteelcomandordebug.
Esdecir,unprogramaRubypuro,porejemplo,paraterminal,ellugardeserlanzadocon
rubyprograma.rb,selolanzaconrdebugprograma.rb
ParaunproyectotpicodeRuby,estagemaseinstalacon
sudo gem1.8 install ruby-debug
gem install ruby-debug
Eldebuggersecontrolamediantepalabrascomolist,continue,next,yotrasqueveremos
enelsiguientecapitulo.
Debuggear en Rails
EnelcasodeRailsdebemoscumpliralgunospasosextrasparatodoconecteardebug.
ComenzamosagregandoalarchivoGemfileunalnea:
gem 'ruby-debug'
Yluegocorremos
sudo bundle install
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag180/197actualizadoal06/01/13
Ahoracorremoselserverdepruebasconunaadidoalfinal:
rails server --debugger
Lalineadebuggerpausalaejecucin.Sivamosalasalidadelrailsserver,descubriremos
quelaejecucinsehadetenido,yquenosesperaunpromptparaintroducircomandos.
Elcomandohelpnosproveerayuda:
(rdb:2) help
ruby-debug help v0.10.3
Type 'help <command-name>' for help on a specific command
Available commands:
backtrace
delete
enable
help
next
quit
show
undisplay
break
disable
eval
info
reload
source
up
catch
display
exit
irb
pp
restart
step
var
condition
down
finish
list
ps
save
thread
where
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag181/197actualizadoal06/01/13
continue
edit
frame
method
putl
set
trace
Porejemplo,listnosmostrarlaseccinqueestamosrevisando:
(rdb:41) list
[3, 12] in
/home/s/Escritorio/Proyectos/r3uw/app/controllers/checklist_controller.rb
3
4
@bichos = Bug.all
end
5
6
7
=> 8
9
10
11
def check
debugger
@bugs = Bug.all
@bugs.each do |bug|
params[:cb_].each do |parametro|
if bug.id == parametro.id
12
bug.accepted = true
Nolohagatodava,perolaordencontinueseguirlaejecucinhastaelfinal(ohastaque
encuentreunapalabrabreakpoint;)
(rdb:2) continue
Podemostambinavanzardeapocousandosteponext.Ladiferenciaentreunoyotro
estribaenquesibiennextcontinuaralalnea9delejemplo,silovolvemosaejecutarall,
luegosaltarlaexplicacindelbucle(nextnosemeteralbucle).Encambiostepentrar
ala9.Perosivolvemosaejecutarloall,enlugardepasarala10,descenderalniveldelas
librerasdeRailsparamostrarnosloqueocurredentrode.each!,locualrequierede
mayoresconocimientos.
Enpocaspalabras:utilicenextparaavanzar,ystepparadescenderniveles.
Otraordenimportanteesinstance_variables,lacuallistatodaslasvariablesenejecucin.
(rdb:195) instance_variables
["@_params", "@_config", "@lookup_context", "@_action_name", "@_status",
"@view_context_class", "@_response", "@_headers", "@action_has_layout",
"@_response_body", "@_env", "@_request", "@bugs"]
Siporejemplo,queremosinvestigarlavariable@_params,podemosrevisarlaaligualqueen
rdebugconlaordendisplay@params,oenelcasodeRails,simplementelomencionamos
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag182/197actualizadoal06/01/13
eneldebugger:
(rdb:195) @_params
{"cb_"=>{"6"=>"6", "7"=>"7", "13"=>"13", "27"=>"27", "28"=>"28", "2"=>"2",
"18"=>"18", "3"=>"3", "4"=>"4", "21"=>"21", "5"=>"5"}, "commit"=>"Submit
Selected", "authenticity_token"=>"n0wBjYDJqzEr1vi3ECVhNkqFnU1LqEd9g4TQK4Y5psg=",
"utf8"=>"\342\234\223", "action"=>"check", "controller"=>"checklist"}
Recuerdequesicambiaelcdigofuenteduranteunasesindeldebugger,nosiempre
podrcontinuar(continue)hastaelfinalyvolveralanzarelcdigo(F5enelnavegador).
Seguirnfigurandolosmismoserroresapesardehabersidocorregidos.DeberhacerCtrl+
Cenlasalidadelserver,yrecomenzarunasesinfresca.Esdecir,debehacerlomismoque
siestuvieraconcualquierlenguaje.
Finalmente,algomagnficodeestedebuggeresquepodemosllamarairbencualquier
momentoparajugarconlasvariablesquevamosrevisando.
Enhttp://guides.rubyonrails.org/debugging_rails_applications.htmlpodemosencontrar
explicadosestoscomandos.
Listas de Correo
Laslistasdecorreosonlaprincipalfuentederesolucindeproblemas.Anmese,yantese:
sesorprenderdeencontrarunacomunidadmuyamable,compuestaconexpertosquese
sientenagustoplanteandoproblemasysoluciones.
ListaEspaola:http://lists.simplelogica.net/mailman/listinfo/rores
ListaArgentina:http://lista.rubyargentina.com.ar/listinfo.cgi/rubyrubyargentina.com.ar
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag183/197actualizadoal06/01/13
Paraleerloscorreosquellegan,lerecomiendoqueutiliceunclientecomoThunderbird,
Kmail,SylpheedyEvolution.stosprogramaspermitenmanejarlasconversaciones
mediantethreads(hilos).LosfiltrosdeGmailtambinsonmuybuenosanidando
conversaciones.
Imagenobtenidademiotrolibro,RedesLibres,ApndiceA"Ayuda",unaversinextendidadeesteApndice.
Puededescargarlodesdewww.bunker.org.ar/incubadora/redes.pdf
Twitter
LacomunidaddeSoftwareLibre,yparticularmenteladeRuby,seencuentranconectadas
casiexclusivamentemedianteestaredsocial.Aquhaynoticiasdeprimeramano,del
mismofrentedecombateenRuby,ydelosmismoscreadoresdeRailsysusgemas.
SiesusuariodeTwitter,sabrqueelsecretoconsisteenseguir("Follow")solamentegente
interesante.Comoejemplo,lerecomiendosigaamiscontactos:sustweetssonverdaderos
mazazosdeinformacintil:
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag184/197actualizadoal06/01/13
AutoressobreTutoriales:
https://twitter.com/railstutorialMichaelHartl,elcreadordeunlibromejorqueeste.
https://twitter.com/RubyLearningSatishTalim,Guru
https://twitter.com/samrubyOtrogranescritor
https://twitter.com/raymichaRaymiSaldomando,laexpertaenmaquetado
Noticiasfrescas:
https://twitter.com/rails
https://twitter.com/rubyflow
https://twitter.com/RubyInside
https://twitter.com/ruby_news
https://twitter.com/rails_bookmarks
Programadoresyminerosdegemasquehayqueseguir:
https://twitter.com/dhhDavidHeinemeierHansson,ElcreadordeRuby
https://twitter.com/soveran:MichelMartens
https://twitter.com/AkitaOnRails:FabioAkita
https://twitter.com/luislavena:LuisLavena
https://twitter.com/drnicElincrebleDrNic
https://twitter.com/karanchoYo:)
Cheatsheets y RI
Habamosyamencionadoario"RubyInformation",uncomandocapazdeobtenerdesde
consola,ayudasobreloscomandosylibrerasdeRuby.
Porotrolado,estnlascheatsheetso"tarjetasdereferenciarpida":resmenesrpidosy
concisos,listosparaserpegadosauncostadodelmonitor.Increblemente,hayunagema
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag185/197actualizadoal06/01/13
enRubydondesecentralizantodaslasayudasgeneradasporlacomunidad.
PodemosencontrarvariasenformatoPDF,enlasdirecciones
http://cheat.errtheblog.com
https://www.dropbox.com/gallery/4822841/1/Rails%203%20Cheat%20Sheets?h=d08610#/
Perosiempresermascoolsolicitarlasvalneadecomandos:
sudo gem1.8 install cheat
gem install cheat
Paraverloscomandosdisponibles
cheat cheat
Paraverunalistadelascheatsheetsdisponibles
cheat sheets
Ejemplodecheatsheetsquevalenlapenamirar
cheat rails_console
cheat unix
cheat vim
cheat cucumber
cheat has_many
cheat wife
cheat rails
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag186/197actualizadoal06/01/13
ApndiceB
Links Recomendados & Imperdibles
EnIngles
Libros
Gratis:
www.railstutorial.org
Pagos
AgileWebDevelopmentwithRails,CuartaEdicinprcticamentelabibliade
Rails
Revistas,gratis:
http://railsmagazine.com
ScreenCastingsyvideosgratis
www.railscasts.com
http://globalplaza.org/spaces/conferenciarails/videos
http://teachmetocode.com/screencasts
Tutorialesasistidos
Gratis
http://tryruby.orgPequeoTutorialonlinesobreRuby
http://railsforzombies.orgTutorialonlinesobreRuby,muysimptico.Tieneotras
seccionespagas,peroquevalenlapena.
ConsulteotrosquevoydejandosincronizadosconmiFirefox,en
http://del.icio.us/karancho/ruby+tutoriales
Pagos
www.railstutorial.org(videospagos).
EnEspaol
Libros
Gratis
Lapresenteobra,yAFAIK(25),ningnotro.
Pagos
25 AsFarIKnowHastadondepudesaber.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag187/197actualizadoal06/01/13
Lapresenteobra,versinenpapel,idealparalacarteradeladama,yel
bolsillodelcaballero.
Casting,Videos:
http://es.asciicasts.com
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag188/197actualizadoal06/01/13
Entrarconcasco
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag189/197actualizadoal06/01/13
DefinirenGemfilelaentrada
gem 'devise'
AgregardevisealGemfile,lanzarbundle
bundle install
Instalarelnuevogenerador
Talcomoserecomiendaporelenvodecorreo,agregara
config/environments/development.rblalinea
(ycorregirlacuandosubaaproduccinenunserverconcapacidaddeenvodecorreo).
Quedaindicaralgunarutapordefectoenconfig/routes.rbojoelplural.Yoescogi
(ADAPTAR)
root :to => "bugs#index"
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag190/197actualizadoal06/01/13
Salirdeconfig/routes.rb,porqueenseguidaelgeneradordevisevaatocarlo.
rails generate devise User
invoke
active_record
create
app/models/user.rb
invoke
test_unit
create
test/unit/user_test.rb
create
test/fixtures/users.yml
inject
app/models/user.rb
create
db/migrate/20100412200407_devise_create_users.rb
route
devise_for :users
Cuandoelgeneradordevisegenera(valgalaredundancia)unmodeloquesirvaparaque
losdemsseautentiquenconl,ledalaformaquesepuedeapreciaren:
app/models/user.rb
db/migrate/20100412200407_devise_create_users.rb
aunqueenlanuevaversindelagemanohacefaltacambiarnada,convieneleerpara
quesirvenlositemsdeadentroyadaptarsihicierafalta.Lagemaseencuentramuybien
documentadaenhttp://github.com/plataformatec/devise/.
rake db:migrate
Convienerevisarlasrutasconrakeroutes,yaalprincipioaparecenciertasurlmuytiles:
new_user_se GET
ssion
/users/sign_in
{:controller=>"devise/sessions", :
action=>"new"}
user_sessio POST
n
/users/sign_in
{:controller=>"devise/sessions", :
action=>"create"}
destroy_use GET
r_session
/users/sign_out
{:controller=>"devise/sessions", :
action=>"destroy"}
/users/password(.:format)
{:controller=>"devise/passwords",
:action=>"create"}
user_passwo PUT
rd
/users/password(.:format)
{:controller=>"devise/passwords",
:action=>"update"}
new_user_pa GET
ssword
/
{:controller=>"devise/passwords",
users/password/new(.:forma :action=>"new"}
t)
POST
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag191/197actualizadoal06/01/13
edit_user_p GET
assword
/
{:controller=>"devise/passwords",
users/password/edit(.:form :action=>"edit"}
at)
POST
/users(.:format)
{:controller=>"devise/registration
s", :action=>"create"}
PUT
/users(.:format)
{:controller=>"devise/registration
s", :action=>"update"}
user_regist DELE
ration
TE
/users(.:format)
new_user_re GET
gistration
/users/sign_up(.:format)
{:controller=>"devise/registration
s", :action=>"new"}
edit_user_r GET
egistration
/users/edit(.:format)
{:controller=>"devise/registration
s", :action=>"edit"}
{:controller=>"devise/registration
s", :action=>"destroy"}
Estosdatosqueaprimeravistanotienensentido,sonmuytilescuandoexaminamosla
trazadelrailsserver(odellogequivalenteenlacarpetalog/).
Porejemplo,cuandovemospasarun
Started GET "/users/sign_out" for 192.168.1.10 at Sun Sep 05 02:16:56 -0300 2010
Processing by Devise::SessionsController#destroy as HTML
User Load (1.1ms)
Significaquequeelusuarioconid=1harealizadounsign_out,yporlotantosehadestruido
susesin:
destroy_user
GET
/users/sign_out
_session
{:controller=>"devise/sessions",
:action=>"destroy"}
RailshaceusodeinstruccionesREST,yaprovechaciertosvaloresquepuedenmandarlos
navegadoreshaciaunservidorweb.AdemasdeGETyPOST,algunosframeworkscomo
Rails,SinatrayPadrino,proponenrescatardossealesmasquesedejarondeusarhace
muchosaos:PUTyDELETE.
Enestepunto,enhttp://railscasts.com/episodes/209introducingdeviseproponenagregar
allayoutexistenteenapp/views/layouts/application.html.erb,unapequeazonaque
informeelestadodelasesindeusuario:
<div id="user_nav">
<% if user_signed_in? %>
Signed in as <%= current_user.email %>. Not you?
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag192/197actualizadoal06/01/13
Loquesetraduceenquesielusuarionoestlogueado,leaparecernlasopciones
Signup(inscribirse)/SignIn(conectarse)
Siyaseencuentralogueado,mostrarsolamentelaopcinparahacerSignout(salir).
Esteestilodemanejarlosenlaceshasidoconcebidoparanotenerquereescribirlos
vnculosdelosmodosdevelopment,cuyaurlcontendr:3000/etc,ydelmodoproduction,
quecontendreldominioverdaderowww.suempresa.com/etc.
Sinembargo,subsistelaextraamaneradereferirsealcontrolador/accin.
Enelejemplo...dedndesalenew_user_session_path?Enprincipio,delroutes.rb,pero,
adondeva?.Lamejormaneradesaberloesmirandotodaslasrutasdisponiblesmediante
elcomandoderecin,rakeroutes.Copionuevamentelaprimerlnea,yremarcoencolor
azulloqueusteddeberacopiar:
new_user_session
GET
/users/sign_in
{:controller=>"devise/sessions", :
action=>"new"}
Quedacomo
<%= link_to "Sign in", new_user_session_path %>
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag193/197actualizadoal06/01/13
Paraellobastainstalaralprincipiodelcontrolador,unaordenequivalentea:
before_filter :authenticate_user!, :except => [:show, :index]
Habilitamoslacreacindevistaspersonalizadas
rails generate devise:views
Ygeneramosvariasvistaspersonalizadasparalosusuarios
rails generate devise:views users
Siyahemoscreadonuestrousuario,yquisiramosinhibirlacreacindeusuariosnuevos,
tenemosvariasmaneras:
Laformaobviaesquitardeapp/views/layouts/application.html.erblalinea
<%= link_to "Sign up", new_user_registration_path %> or
Otramanera,yqueporseguridadtambinpuedeactivarse,esbuscar
app/views/devise/registrations/new.html.erbycomentarlalinea
<p><%= f.submit "Sign up" %></p>
Demodoquequedealgoascomo
<p><%#= f.submit "Sign up" %></p>
Creacin de nuevos usuarios: <blink>deshabilitado</blink>
Unatercermaneraescrearnuestrospropioscontroladores,ocomenzaramanejarroles,
comosedetallaenhttp://github.com/plataformatec/devise
Queda:
Fusionarconappdelprincipio,demo.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag194/197actualizadoal06/01/13
Internacionalizacin (i18n)
Machete:
Segnguaoficial:http://guides.rubyonrails.org/i18n.html
Modificarlineaconfig.i18n.default_locale=:dedeconfig/application.rb
Agregaraapp/controllers/application_controller.rb
before_filter:set_locale
defset_locale
#ifparams[:locale]isnilthenI18n.default_localewillbeused
I18n.locale=params[:locale]
end
Creares.ymlenconfig/localesalestilodeen.yml,yponerlastraducciones.Idealmente:
merguearconalgunaslocalizacionesmuycompletaspresentes
https://github.com/svenfuchs/railsi18n/tree/master/rails/locale,alafechalamascompleta
eslamexicana(esMX).
hello_world: Hola Mundo
hello_flash: Hola Flash
Usar el helper t, ejemplos
Si en el controlador tenamos:
flash[:notice] = "Hello flash!"
Ahora podemos tener
flash[:notice] = t(:hello_flash)
Si en la vista tenamos
<h1>Hello world!</h1>
<p><%= flash[:notice] %></p>
Ahora podemos tener
<h1><%=t :hello_world %></h1>
<p><%= flash[:notice] %></p>
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag195/197actualizadoal06/01/13
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag196/197actualizadoal06/01/13
Autobombo:maslibrosgratis
Silegustestaobra,quizsdisfrutetambindeesteotrolibrogratuito.
EsuntratadosobreformasdeintegrarLinuxenambientesWindows,convirtindoloenuna
suertedemuletaparalosdemsservidores;unanavajasuizacapazdealigerarlacarga
queposeemoscadadalosadministradoresdesistemas.
EscribestelibrocomounosapuntesparamisalumnosdeAnlisisenSistemas,ycomoun
machete(ayudadememoria,enArgentina)deaquellospasosqueensumomentome
costdevariosdasdeexperimentacin.Allhevolcadomisexperienciasconfigurando
Apache,BIND,PHP,SquidProxy,NAT,FTP,SSH,Samba,administrandousuarios,yvelandopor
laseguridadyestabilidaddelared.
Creame:sepuededisfrutardeltrabajodeSysadmin:elpinginitoTuxeslallave.
SergioA.AlonsoRails3enWindowsyLinuxUbuntuv0.95Betapag197/197actualizadoal06/01/13
Puededescargarlodesdehttp://www.bunker.org.ar/incubadoraredes.pdf