Documente Academic
Documente Profesional
Documente Cultură
PrimerospasosconRailsRubyonRailsGuas
Msenrubyonrails.org:
MsRubyonRails
PrimerospasosconRails
EstaguatratadelevantarseycorrerconRubyonRails.
Despusdeleerestagua,ustedsabr:
CmoinstalarRails,crearunaaplicacindenuevoscarriles,y
conectarlaaplicacinaunabasededatos.
LadisposicingeneraldeunaaplicacinRails.
LosprincipiosbsicosdeMVC(Modelo,Vista,Controlador)yel
diseodedescanso.
Cmogenerarrpidamentelaspiezasapartirdeunaaplicacin
Rails.
Captulos
1. SupuestosGua
2. CulesRails?
3. CreacindeunnuevoproyectodeRails
InstalacindeRieles
CreacindelBlogdeaplicaciones
4. Hola,Rails!
PuestaenmarchadelservidorWeb
http://guides.rubyonrails.org/getting_started.html
1/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Decir"hola",rieles
Configuracindelapginadeiniciodeaplicaciones
5. Conectarseyempezar
Elqueseestablecenlasbases
Laprimeraforma
Creacindeartculos
Creacindelmodelodeartculo
Laejecucindeunamigracin
Almacenamientodedatosenelcontrolador
Mostrandoartculos
Listadodetodoslosartculos
Adicindeenlaces
AgregandounpocodeValidacin
Actualizacindelosartculos
Elusodelosparcialesparalimpiarladuplicacinenlasvistas
Eliminacindelosartculos
6. Adicindeunsegundomodelo
GeneracindeunModelo
AsociarModelos
AdicindeunarutadeComentarios
Generacindeuncontrolador
7. Refactoring
RenderingparcialesColecciones
Segeneraunformularioparcial
8. EliminacinComentarios
Eliminarobjetosasociados
9. Seguridad
http://guides.rubyonrails.org/getting_started.html
2/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Autenticacinbsica
Otrasconsideracionesdeseguridad
10. Qusigue?
11. Gotchasconfiguracin
1GuaSupuestos
EstaguaestdiseadaparaprincipiantesquequierenempezaratrabajarconunaaplicacinRailsdesde
cero.NosesuponequetienealgunaexperienciapreviaconRails.Sinembargo,paraobtenerelmximo
provechodeella,tienequehaberalgunosrequisitospreviosinstalados:
ElRubversin1.9.3oposterior.
ElRubyGemssistemadeenvasado,queseinstalaconlasversionesdeRuby1.9yposteriores.
ParaaprendermssobreRubyGems,porfavor,lealasGuasRubyGems.
UnainstalacindetrabajodelabasededatosSQLite3.
RailsesunframeworkdeaplicacioneswebqueseejecutanenellenguajedeprogramacinRuby.Siusted
notieneexperienciapreviaconRuby,podrsencontrarunacurvadeaprendizajemuyempinadabuceo
directamenteenRails.HayvariaslistasdecomisariadosderecursosenlneaparaaprenderRuby:
SitioweboficialLenguajedeProgramacinRub
ListadeLibrosdeprogramacingratisdereSRC
Tengaencuentaquealgunosdelosrecursos,mientrasquesiguesiendoexcelente,abarcarnlasversiones
deRubytanantiguacomola1.6,yporlogeneral1,8,ynoincluirunasintaxisquesepuedenverenel
desarrollodeldaadaconRails.
2CulesRails?
RailsesunframeworkdedesarrollodeaplicacioneswebescritoenellenguajeRuby.Estdiseadopara
hacerquelasaplicacioneswebdeprogramacinfcildehacersuposicionessobreloquenecesitatodoslos
desarrolladoresaempezar.Selepermiteescribirmenoscdigoduranteelcumplimientomsquemuchos
otroslenguajesyframeworks.ExperimentadosdesarrolladoresRailstambininformanquehacequeel
desarrollodeaplicacioneswebmsdivertida.
http://guides.rubyonrails.org/getting_started.html
3/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Railsesobstinadosoftware.Estohacequelasuposicindequenoesla"mejor"maneradehacerlas
cosas,yestdiseadoparaalentaresamanerayenalgunoscasosparadesalentarlasalternativas.Si
ustedaprende"ElRailsWay"esprobablequedescubrirunenormeaumentoenlaproductividad.Sipersiste
entraerviejoshbitosdeotraslenguasasudesarrolloRails,ytratandodeutilizarpatronesqueaprendien
otrolugar,ustedpuedetenerunaexperienciamenosfeliz.
LafilosofaRailsincluyedosprincipiosrectores:
Noterepitas:DRYesunprincipiodedesarrollodesoftwarequeestableceque"Cadapiezade
conocimientodebetenerunsoloinequvoca,larepresentacin,conautoridaddentrodeun
sistema."Pornoescribirlamismainformacinunayotravez,nuestrocdigoesmsfcilde
mantener,msextensible,ymenoserrores.
Convencinsobreconfiguracin:Railstieneopinionessobrelamejormaneradehacermuchas
cosasenunaaplicacinweb,eincumplimientosaesteconjuntodeconvenciones,msque
requierenqueseespecifiquecadaminuciasatravsdearchivosdeconfiguracinsinfin.
3CreacindeunnuevoproyectodeRails
Lamejormaneradeutilizarestaguaesseguircadapasocomosucede,ningncdigoopasonecesario
paraqueesteejemplodeaplicacinsehadejadodelado,paraquepuedaseguirliteralmentepasoapaso.
Alseguirjuntoconestagua,vamosacrearunproyectoRailsllamadoelblog,una(muy)elsimple
weblog.Antesdequepuedaempezaraconstruirlaaplicacin,esnecesarioasegurarsedequeustedtiene
ensRailsinstalado.
Losejemplossiguientesutilizan$pararepresentarsuprontaterminalenunsistemaoperativoUNIX,
aunquepudohabersidopersonalizadoaaparecerdemaneradiferente.SiestutilizandoWindows,el
indicadorseveralgocomoc:\source_code>
3.1InstalacindeRieles
Abraunalneadecomandos.EnMacOSXabiertoTerminal.app,enWindowsseleccione"Ejecutar"enel
menInicioyescriba"cmd.exe".Cualquiercomandoprecedidodeunsignodedlar$sedebenejecutaren
lalneadecomandos.CompruebequedisponedeunaversinactualdeinstaladoRuby:
UnaseriedeherramientasqueexistenparafacilitarlarpidainstalacindeRubyyRubyonRailsensu
http://guides.rubyonrails.org/getting_started.html
4/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
sistema.LosusuariosdeWindowspuedenutilizarRailsinstalador,mientrasquelosusuariosdeMacOS
XpuedenusarTokaido.
$Rubyv
rub2.0.0p353
SiustednotieneinstaladoRubecharunvistazoarubylang.orgdeposiblesformasdeinstalarRubyon
suplataforma.
MuchosnavepopularessistemasoperativostipoUNIXconunaversinaceptabledeSQLite3.Losusuarios
deWindowsyotrospuedenencontrarinstruccionesdeinstalacinenelsitiowebdeSQLite3.Verifique
quesehainstaladocorrectamenteyensuPATH:
$Sqlite3version
Elprogramadebereportarsuversin.
ParainstalarRails,utiliceelgeminstallcomandosproporcionadaporRubyGems:
$Geminstallrails
Paracomprobarquehainstaladotodocorrectamente,usteddeberasercapazdeejecutarelsiguiente:
$Bin/rielesversion
Sidicealgocomo"Rails4.1.1",yaestlistoparacontinuar.
3.2CreacindelBlogdeaplicaciones
http://guides.rubyonrails.org/getting_started.html
5/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Railsvieneconunaseriedesecuenciasdecomandosllamadosgeneradoresqueestndiseadaspara
hacersuvidamsfcileldesarrollomediantelacreacindetodoloqueesnecesarioempezaratrabajaren
unatareaenparticular.Unodeelloseselnuevogeneradordeaplicaciones,loqueleproporcionarlabase
deunaaplicacinRailsfrescoparaqueustednotienequeescribirtumismo.
Parautilizarestegenerador,abreunterminal,vayaaundirectorioenelquetienederechosparacrear
archivosyescriba:
$Carrilesnuevoblog
EstocrearunaaplicacinRailsllamadoBlogenunblogde
directorioeinstalarlasdependenciasdela
gemaqueyasemencionanenGemfileusandobundleinstall.
PuedesvertodaslasopcionesdelneadecomandosquelaaplicacinconstructorRailsaceptaejecutando
carrilesnuevoh.
Despusdecrearlaaplicacindeblog,cambiealacarpeta:
Elblog$cd
Elblogde
directoriotieneunnmerodearchivosgeneradosautomticamenteycarpetasquecomponenla
estructuradeunaaplicacinRails.Lamayorpartedeltrabajoenestetutorialvaasucederenla
aplicacindecarpeta,peroaquhayunresumenbsicodelafuncindecadaunodelosarchivosy
carpetasqueRailscreandeformapredeterminada:
Dearchivo/
carpeta
Propsito
app/
Contieneloscontroladores,modelos,puntosdevista,alosayudantes,losanuncios
publicitariosylosactivosparasuaplicacin.Teenfocasenestacarpetaparael
restodeestagua.
http://guides.rubyonrails.org/getting_started.html
6/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
bin/
Contieneelguinrielesqueseiniciasuaplicacinypuedencontenerotras
secuenciasdecomandosqueseutilizanparaimplementaroejecutarsuaplicacin.
config/
Configurarrutasdesuaplicacin,basededatos,yms.Estoseexplicaenms
detalleenlaConfiguracindeRails.
config.ru
Estanteconfiguracindelosservidoresenrackbasadoutilizadosparainiciarla
aplicacin.
db/
Contieneelesquemadebasededatosactual,ascomolasmigracionesdebasesde
datos.
Gemfile
Gemfile.lock
Estosarchivospermitenespecificarqudependenciasjoyaquedeseeparasu
aplicacinRails.EstosarchivossonutilizadosporlagemaBundler.Paraobtener
msinformacinacercadeBundler,consulteelsitiowebdeBundler.
lib/
Mdulosextendidosparasuaplicacin.
log/
Archivosderegistrodeaplicacin.
pblico/
Lanicacarpetavistoporelmundocomoest.Contienelosarchivosestticosy
activoscompilados.
Rakefile
Estearchivolocalizaycargadetareasquesepuedenejecutardesdelalneade
comandos.Lasdefinicionesdetareassedefinenatravsdeloscomponentesde
Rails.EnlugardecambiarRakefile,debeagregarsuspropiastareasmediantela
adicindearchivoseneldirectoriolib/tareasdelaaplicacin.
README.rdoc
Esteesunbrevemanualdeinstruccionesparasuaplicacin.Debeeditareste
archivoparadeciralosdemsloquehacesuaplicacin,cmoconfigurarlo,yas
sucesivamente.
prueba/
Laspruebasunitarias,accesoriosyotrosaparatosdeprueba.Estossetratanen
TestingRails.
tmp/
Losarchivostemporales(comoarchivosdecach,pid,ydesesin).
http://guides.rubyonrails.org/getting_started.html
7/56
28/11/2014
vendedor/
PrimerospasosconRailsRubyonRailsGuas
Unlugarparatodoelcdigodeterceros.EnunaaplicacintpicaRailsestoincluye
gemasquevendeservicios.
Dearchivo/carpeta
app/
bin/
config/
config.ru
db/
Gemfile
Gemfile.lock
lib/
log/
pblico/
Rakefile
README.rdoc
prueba/
tmp/
vendedor/
http://guides.rubyonrails.org/getting_started.html
8/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
4Hola,Rails!
Paraempezar,vamosaconseguirunpocodetextoenlapantallarpidamente.Parahaceresto,usted
necesitaparaobtenersuRailsservidordeaplicacinenejecucin.
4.1PuestaenserviciodelservidorWeb
Dehecho,tienesunaaplicacinfuncionalRailsya.Paraverlo,necesitainiciarunservidorwebenelequipo
dedesarrollo.Ustedpuedehacerestomediantelaejecucindelsiguienteenelblogde
directorio:
$Binservidor/rieles
CompilarCoffeeScripttenerJavaScriptrequiereuntiempodeejecucindeJavaScriptylaausenciadeun
tiempodeejecucinledarunaexecjserror.Porlogeneral,MacOSXyWindowsvienenconuntiempo
deejecucindeJavaScriptinstalado.RailsaadeeltherubyracerjoyaalageneradaGemfileenunalnea
comentadadenuevasaplicacionesysepuedeanularelcomentario,silonecesita.therubyrhinoesel
tiempodeejecucinserecomiendaaquienesJRubyyseaadepordefectoalaGemfileenaplicaciones
generadasbajoJRuby.Ustedpuedeinvestigaracercadetodoslostiemposdeejecucinsoportadosen
ExecJS.
EstolanzarWEBrick,unservidorwebdistribuidoconRubypordefecto.Paraversuaplicacinenaccin,
abraunaventanadelnavegadoryvayaahttp://localhost:3000.Usteddebeverlapginadeinformacin
pordefectoRails:
Paradetenerelservidorweb,pulseCtrl+Cenlaventanadeterminal,dondeseestejecutando.Para
verificarqueelservidorsehadetenidousteddebeverelcursordelsmbolodelsistemanuevo.Parala
mayoradelossistemasUNIX,incluyendoMacOSXestoserunsignodedlar$.Enelmodode
desarrollo,Railsnogeneralmenterequierenqueustedreinicieelservidorloscambiosquerealiceenlos
archivossernrecogidosautomticamenteporelservidor.
Lapgina"Bienvenidosabordo"eslapruebadefuegoparaunanuevaaplicacinRails:Seaseguradeque
ustedtieneconfiguradoelsoftwarelosuficientementecorrectaparaserviraunapgina.Tambinpuede
hacerclicsobreelmedioambienteAcercadesusolicituddeenlaceparaverunresumendeelentornode
suaplicacin.
http://guides.rubyonrails.org/getting_started.html
9/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
4,2decir"hola",rieles
ParaobtenerRailsdecir"hola",esnecesariocrearalmenosuncontroladoryunavista.
Elpropsitodeuncontroladoresrecibirpeticionesespecficasparalaaplicacin.enrutamientodecidequ
controladorrecibelaquesepide.Amenudo,haymsdeunarutaparacadacontrolador,ylasdiferentes
rutaspuedeserservidopordiferentesacciones.Elpropsitodecadaaccinesrecogerlainformacinque
leproporcioneaunavista.
http://guides.rubyonrails.org/getting_started.html
10/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Elpropsitodeunpuntodevistaesparamostrarestainformacinenunformatolegibleporhumanos.Una
distincinimportantequehaceresqueeselcontrolador,nolavista,dondeserecogelainformacin.La
vistaslodebemostraresainformacin.Pordefecto,lasplantillasdevistaestnescritosenunlenguaje
llamadoeRuby(EmbeddedRub)queseprocesaporelciclodepeticinenRailsantesdeserenviadoal
usuario.
Paracrearunnuevocontrolador,tendrqueejecutarelgeneradorde"controlador"ydecirlequequieresun
controladorllamado"bienvenida"conunaaccinllamada"ndice",aligualqueesta:
$Bin/rielesgenerancontroladorndicedebienvenida
Railscrearnvariosarchivosyunarutaporusted.
crearapp/controllers/welcome_controller.rb
getruta'bienvenido/index'
invocarerb
crearapp/views/bienvenida
crearapp/views/bienvenidos/index.html.erb
invocartest_unit
Crearprueba/controllers/welcome_controller_test.rb
invocarayudante
crearapp/helpers/welcome_helper.rb
invocartest_unit
Crearprueba/helpers/welcome_helper_test.rb
invocaractivos
invocarcaf
crearapp/assets/javascripts/welcome.js.coffee
invocarSCSS
crearapp/assets/hojasdeestilo/welcome.css.scss
Elmsimportantedestosson,porsupuesto,elcontrolador,queseencuentraenapp/controllers/
welcome_controller.rbylavista,queseencuentraenapp/views/bienvenidos/index.html.erb
.
http://guides.rubyonrails.org/getting_started.html
11/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Abralavistaapp//welcome/index.html.erbarchivoentueditordetexto.Eliminetodoelcdigo
existenteenelarchivo,yreemplazarlaconlasiguientelneadecdigo:
<h1>Hola,Rails!</h1>
4.3Configuracindelapginadeiniciodeaplicaciones
Ahoraquehemoshechoelcontroladorylavista,tenemosquedecirleaRailscuandoqueremos"Hola,
rieles!"aaparecer.Ennuestrocaso,queremosqueaparezcacuandonavegamosalaURLrazdenuestro
sitioweb,http://localhost:3000.Porelmomento,"Bienvenidoabordo"estocupandoeselugar.
Acontinuacin,ustedtienequedecirleaRails,dondeseencuentrasupginadelacasareal.
Abraelarchivoconfig/routes.rbensueditor.
Rails.application.routes.drawhacer
conseguir"bienvenido/index'
#Laprioridadsebasaenelordendelacreacin:
#Primerocreado>prioridadmsalta.
#
#Sepuedetenerlarazdesusitioenrutadacon"root"
#Root'bienvenidondice#'
#
#...
SetratadelaaplicacindearchivosdeenrutamientoquecontienelasentradasdeunaDSLespecial
(lenguajededominioespecfico)quelediceaRailscmoconectarlassolicitudesentrantesalos
controladoresyacciones.Estearchivocontienemuchasrutasdemuestraenlneasdecomentarios,yuno
deellosenrealidadlemuestracmoconectarlarazdesusitioauncontroladoryunaaccinespecfica.
Busquelalneaquecomienzaconlarazyeliminelamisma.Debeseralgocomolosiguiente:
raz"bienvenido#ndice'
http://guides.rubyonrails.org/getting_started.html
12/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
root'bienvenida#index'diceRailsparamapearpeticionesalarazdelaaplicacindelaaccinindex
delcontroladorbienvenidayconseguir"bienvenido/index'diceRailsparaasignarsolicitudesahttp:
//localhost:3000/bienvenidos/ndicedelaacogidaaccinindexdelcontrolador.Estefuecreadoa
principiosdecuandoejecutelgeneradordecontrolador(rielesgenerancontroladorndicede
bienvenida).
Inicieelservidorwebdenuevosielquelodetuvoparagenerarelcontrolador(servidorrieles)yvayaa
http://localhost:3000ensunavegador.Verslos"Hola,rieles!"mensajequepusoenapp/views/
bienvenidos/index.html.erb,loqueindicaqueestanuevarutaesdehechovaaWelcomeController
'sndicedelaaccinyestprestandolavistacorrectamente.
Paraobtenermsinformacinacercadelenrutamiento,consulteRailsenrutamientodeafuerahacia
adentro.
5Conectarseyempezar
Ahoraqueyahasvistocmocrearuncontrolador,unaaccinyunavista,vamosacrearalgoconunpoco
msdesustancia.
EnlaaplicacindeBlog,ahoracrearunnuevorecurso.Unrecursoeseltrminoutilizadoparauna
coleccindeobjetossimilares,talescomoartculos,personasoanimales.Puedecrear,leer,actualizary
destruirelementosparaunrecursoyestasoperacionesseconocencomoCRUDoperaciones.
RailsproporcionaunrecursosmtodoquesepuedeutilizarparadeclararunrecursoRESTestndar.Esto
esloqueconfig/routes.rbdebesersimilardespusdequeelrecursodelartculosedeclara.
Rails.application.routes.drawhacer
Recursos:artculos
raz"bienvenido#ndice'
fin
http://guides.rubyonrails.org/getting_started.html
13/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Siejecutarutasrastrillo,versquesehadefinidorutasparatodaslasaccionesRESTestndar.El
significadodelacolumnaelprefijo(yotrascolumnas)severmsadelante,peroporahoracuentadeque
Railshadeducidolaformasingularartculoyhaceusosignificativodeladistincin.
$bin/rutasrastrillo
PatrnPrefijoverbalURIController#Accin
artculosGET/articles(.:format)artculosndice#
POSTE/articles(.:format)artculos#crea
new_articleOBTENER/articles/new(.:format)artculos#nuevo
edit_articleGET/articles/:id/edit(.:format)artculos#edit
artculoGET/articles/:id(.:format)artculos#show
PARCHE/articles/:id(.:format)artculos#update
/articles/:id(.:format)ArtculosPUT#update
BORRAR/articles/:id(.:format)artculos#destruyen
GETroot/bienvenidandice#
Enlasiguienteseccin,aadirlacapacidaddecrearnuevosartculosensuaplicacinypoderverlas.
Estaesla"C"yla"R"deCRUD:creacinylectura.Laformadehacerestoseveras:
Severunpocobsicoporahora,peroesoestbien.Veremosamejorarelestiloparadespus.
5.1queseestableceeltrabajodecampo
Enprimerlugar,ustednecesitaunlugardentrodelaaplicacinparacrearunnuevoartculo.Ungranlugar
paraesoestaraen/artculos/nuevo.Conlarutayadefinida,lassolicitudessepuedenhacerahoraa
/articulos/nuevosenlaaplicacin.Navegarahttp://localhost:3000/artculos/nuevoyversun
errordeenrutamiento:
Esteerrorseproduceporquelarutatienequeteneruncontroladordefinidoconelfindeatenderlasolicitud.
Lasolucinaesteproblemaenparticularessimple:crearuncontroladorllamadoArticlesController.
Ustedpuedehacerestomediantelaejecucindeestecomando:
$Bin/carrilesartculoscontroladorg
http://guides.rubyonrails.org/getting_started.html
14/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Siustedabreelrecingeneradoapp
/controllers/
articles_controller.rbversun
controladorbastantevaco:
claseArticlesController<ApplicationController
http://guides.rubyonrails.org/getting_started.html
15/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
fin
UncontroladoressimplementeunaclasequesedefineaheredardeApplicationController.Esdentro
deestaclasequeustedvaadefinirlosmtodosqueseconvertirnenlasaccionesdeestecontrolador.
EstasaccionesrealizaroperacionesCRUDsobrelosartculosdentrodenuestrosistema.
Haypblicas,privadasyprotegidasmtodosenRuby,peroslopblicosmtodospuedenserlas
accionesparaloscontroladores.ParamsdetallesvisitadeprogramacinRuby.
Siactualizashttp://localhost:3000/artculos/nuevoahora,obtendrsunnuevoerror:
Este
error
indicaqueloscarrilesnosepuedeencontrarlanuevaaccindentrodelArticlesControllerqueacabade
generar.EstosedebeaquecuandoloscontroladoressegeneranenRailsestnvacospordefecto,a
menosqueustedleindiquesusaccionesdeseadasduranteelprocesodegeneracin.
Paradefinirmanualmenteunaaccindentrodeuncontrolador,todoloquenecesitahaceresdefinirun
nuevomtododentrodelcontrolador.Abrirapp/controllers/articles_controller.rbydentrodel
ArticlesControllerclase,definirunnuevomtodocomoeste:
defnuevo
fin
ConelnuevomtododefinidoenArticlesController,siactualizahttp://localhost:3000/artculos/
nuevoversotroerror:
http://guides.rubyonrails.org/getting_started.html
16/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Ustedestrecibiendoesteerrorahoraporque
Railsesperaquelasaccionesdecivilcomo
steparatenervistasasociadasconellos
paramostrarsuinformacin.Sinvistas
disponibles,Railserrorescabo.
Enlaimagensuperior,elfondoseha
truncado.Vamosaverloquelacosa
completaseveas:
Faltanartculosplantilla/nueva,laaplicacin/nuevoscon{locale:[:en],formatos:[html],manipuladores:
[:erb,:constructor,:caf]}.Buscadoen:*"/path/to/blog/app/views"
Esaesunagrancantidaddetexto!Vamosairrpidamenteatravsyentenderloquecadapartedeloque
hace.
Laprimeraparteidentificaquplantillaquefalta.Enestecaso,eselartculos/nuevaplantilla.Rails
primerobuscarestaplantilla.Sinoloencuentra,entoncesintentarcargarunaplantillallamada
application/nuevo.PareceunaaquporqueelArticlesControllerheredade
ApplicationController.
Lasiguientepartedelmensajecontieneunhash.El:localeclaveenestehashsimplementeindicaqu
plantillalenguajehabladodebeserrecuperada.Pordefecto,esteeselInglso"en"plantilla.Lasiguiente
tecla,:Formatosespecificaelformatodeplantillaquesesirveenlarespuesta.Elformatopredeterminado
es:html,yasRailsestbuscandounaplantillaHTML.Laclavefinal,:manipuladores,nosest
diciendoloquelosmanipuladoresdeplantillapodraserutilizadoparahacernuestraplantilla.:erbesms
comnmenteutilizadoparalasplantillasHTML,:ConstructorseusaparalasplantillasXML,y:caf
utilizaCoffeeScriptparaconstruirplantillasdeJavaScript.
LapartefinaldeestemensajenosdicedndeRailshabuscadolasplantillas.Plantillasdentrodeuna
aplicacinbsicaRailscomoestosemantienenenunsololugar,peroenaplicacionesmscomplejasque
podransermuchoscaminosdiferentes.
Laplantillamssimplequefuncionaraenestecasoseraunoencuentraenapp/views/artculos/
new.html.erb.Laextensindeestenombredearchivoesclave:laprimeraextensineselformatodela
http://guides.rubyonrails.org/getting_started.html
17/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
plantilla,ylasegundaextensineselcontroladorqueseutilizar.Railsesttratandodeencontraruna
plantillallamada/artculosnuevosenapp/viewsparalaaplicacin.Elformatodeestaplantillaslo
puedeserhtmlyelmanejadordebeserunodeerb,constructorocaf.Debidoaqueusteddeseacrear
unnuevoformularioHTML,ustedvaautilizarlaERBidioma.Porlotantoelarchivodeberallamarse
artculos/new.html.erbynecesitaserubicadodentrodelaapp/viewsdirectoriodelaaplicacin.
Adelanteahoraycrearunnuevoarchivoenapp/views/artculos/new.html.erbyescribireste
contenidoenella:
<h1>Nuevoartculo</h1>
Alactualizarhttp://localhost:3000/artculos/nuevoahoravaaverquelapginatieneunttulo.La
ruta,controlador,accinyvisinestnahoratrabajandoenarmona!Eselmomentodecrearlaformadeun
nuevoartculo.
5.2Laprimeraforma
Paracrearunformulariodentrodeestaplantilla,quevaautilizarunconstructordeformulario.El
constructordelaformaprimariadeRailsesproporcionadaporunmtododeayudallamadoform_for.
Parautilizarestemtodo,agregueestecdigoenapp/views/artculos/new.html.erb:
<%=Form_for:artculohacer|f|%>
<P>
<%=F.label:%title><br>
<%=F.text_field:%title>
</P>
<P>
<%=F.label:Texto%><br>
<%=F.text_area:Texto%>
</P>
<P>
<%=F.submit%>
</P>
<%Fin%>
http://guides.rubyonrails.org/getting_started.html
18/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Siactualizaslapginaahora,verslamismaformaexactacomoenelejemplo.Creacindeformulariosen
Railsesrealmenteasdefcil!
Cuandollameform_for,selepasaunobjetodeidentificacinparaesteformulario.Enestecaso,esel
smbolo:elartculo.Estoledicealform_forayudanteloqueesteformularioespara.Dentrodel
bloquedeestemtodo,elFormBuilderobjetorepresentadaporfseutilizaparalaconstruccindedos
etiquetasydoscamposdetexto,unocadaunoparaelttuloyeltextodeunartculo.Porltimo,una
llamadaapresentarenlafobjetocrearunbotndeenvodelformulario.
Hayunproblemaconestaformaembargo.SiinspeccionaelcdigoHTMLquesegenera,mediantela
visualizacindelafuentedelapgina,verquelaaccindeatributoparalaformaestapuntandoa/
artculos/nuevo.Estoesunproblemaporqueestarutavaalamismapginaqueestsenladerecha
enelmomento,yesarutaslosedebeutilizarparamostrarlaformadeunnuevoartculo.
LaformatienequeutilizarunaURLdiferenteconelfindeiraotrolugar.Estosepuedehacersimplemente
conel:urlopcindeform_for.NormalmenteenRails,laaccinqueseutilizaparaformarnuevas
presentacionescomoestasellama"crear",porloqueelformulariodebeserdirigidoaesaaccin.
Editarelform_forlneadentroapp/views/artculos/new.html.erbateneresteaspecto:
<%=Form_for:artculo,url:articles_pathhacer|f|%>
Enesteejemplo,elarticles_pathhelpersepasaal:urlopcin.ParaverloqueRailsvaahacercon
esto,miramoshaciaatrsenlasalidaderutasderake:
$bin/rutasrastrillo
PatrnPrefijoverbalURIController#Accin
artculosGET/articles(.:format)artculosndice#
POSTE/articles(.:format)artculos#crea
new_articleOBTENER/articles/new(.:format)artculos#nuevo
edit_articleGET/articles/:id/edit(.:format)artculos#edit
http://guides.rubyonrails.org/getting_started.html
19/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
artculoGET/articles/:id(.:format)artculos#show
PARCHE/articles/:id(.:format)artculos#update
/articles/:id(.:format)ArtculosPUT#update
BORRAR/articles/:id(.:format)artculos#destruyen
GETroot/bienvenidandice#
Elarticles_pathayudantelediceaRailsparasealarlaformaalpatrnURIasociadoconelartculos
prefijoyelformulario(pordefecto)envaunPOSTEsolicitudaesaruta.Estoseasociaconlacreacinde
laaccindelreguladordecorriente,elArticlesController.
Conlaformaysurutaasociadadefinidos,ustedsercapazdellenarelformularioyhagaclicenelbotn
deenvoparainiciarelprocesodecreacindeunnuevoartculo,asqueadelanteyhacereso.Alenviarel
formulario,usteddebeveraunerrorconocido:
AhoratendrquecrearelcrearlaaccindentrodelaArticlesControllerparaqueestofuncione.
5.3Creacindeartculos
Parahacerquela"accinDesconocido"desaparece,sepuededefiniruncrearaccindentrodel
ArticlesControllerclaseenapp/controllers/articles_controller.rb,debajodelanueva
accin:
claseArticlesController<ApplicationController
defnuevo
fin
defcrear
fin
http://guides.rubyonrails.org/getting_started.html
20/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
fin
Sivuelveaenviarelformularioahora,versotroerrorfamiliar:unaplantillanoseencuentra.Esoestbien,
podemosignorarque,porahora.Loquelacreacindeaccindeberaestarhaciendoessalvarnuestro
nuevoartculoalabasededatos.
Cuandoseenvaunformulario,loscamposdelformulariosonenviadosaRailscomoparmetros.Estos
parmetrospuedenserreferenciadosdentrodelasaccionesdelcontrolador,porlogeneralserealizauna
tareaenparticular.Paraverloqueestosparmetrosseparecen,cambieelcrearaccionesparaesto:
defcrear
rendersencillo:params[:artculo].inspect
fin
Elrendermtodoaquestomarunmuysimplehashconunaclavedellanurayelvalordeparams[:
artculo].inspect.Elparamsmtodoeselobjetivoquerepresentalosparmetros(ocampos)que
vienedelaforma.ElparamsmtododevuelveunActiveSupport::HashWithIndifferentAccessobjeto,
quelepermiteaccederalasclavesdelhashusandocadenasosmbolos.Enestasituacin,losnicos
parmetrosqueimportansonlosdelaforma.
Sivuelveaenviarelformulariounavezmsustedahorayanoobtieneelerrorplantillaquefalta.Ensu
lugar,veralgoparecidoalosiguiente:
{"title"=>"Primerartculo!","texto"=>"Esteesmiprimerartculo."
}
Estaaccinmuestraahoralosparmetrosdelartculoqueregresadespusdelaforma.Sinembargo,esto
noesrealmentetantil.S,sepuedeverlosparmetrosperonohaynadaenparticularqueseest
haciendoconellos.
5.4Creacindelmodelodeartculo
http://guides.rubyonrails.org/getting_started.html
21/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
ModelosenRailsutilizanunnombresingular,ysustablasdebasededatoscorrespondientesutilizanun
nombreplural.Railsproporcionaungeneradorparalacreacindemodelos,quelamayoradelos
desarrolladoresdeRailstiendenautilizaralcrearnuevosmodelos.Paracrearelnuevomodelo,ejecute
estecomandoenelterminal:
$Bin/rielesgenerarTtulodelartculomodelo:stringtexto:Texto
ConesecomandoledijimosaRailsquequeremosunartculomodelo,juntoconunttuloatributodetipo
cadena,yuntextodeatributosdetipotexto.Esosatributosseagreganautomticamentealaartculos
tablaenlabasededatosyseasignaalartculomodelo.
Barandillasrespondidocreandounmontndearchivos.Porahora,sloestamosinteresados
enapp/
models/article.rbydb/migrar/20140120191729_create_articles.rb(sunombrepodraserun
pocodiferente).Esteltimoesresponsabledelacreacindelaestructuradebasededatos,queesloque
vamosaveracontinuacin.
ActiveRecordeslosuficientementeinteligentecomoparaasignarautomticamentenombresdecolumna
paramodelaratributos,loquesignificaqueustednotienequedeclararatributosdentroRailsmodelos,que
seharautomticamenteporActiveRecord.
5.5Laejecucindeunamigracin
Comoacabamosdever,rielesgeneranmodelocreadounabasededatosdemigracindearchivos
dentrodeladb/migrardirectorio.LasmigracionessonclasesdeRubyquesehandiseadoparaque
seafcildecrearymodificartablasdelabase.Railsutilizacomandosderastrilloparaejecutarlas
migraciones,yesposibledeshacerunamigracindespusdequesehaaplicadoasubasededatos.Los
nombresdearchivodemigracinincluyenunamarcadetiempoparaasegurarsedequeseprocesanenel
ordenenquefueroncreados.
Sinosfijamoseneldb/migrar/20140120191729_create_articles.rbarchivo(recuerde,elsuyo
tendrunnombreligeramentediferente),estoesloqueencontrar:
claseCreateArticles<ActiveRecord::Migracin
http://guides.rubyonrails.org/getting_started.html
22/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
defcambio
create_table:artculoshacen|t|
t.string:ttulo
t.text:texto
t.timestamps
fin
fin
fin
Lamigracindearribacreaunmtodollamadocambioquesellamarcuandoseejecutaestamigracin.La
accindefinidaenestemtodotambinesreversible,loquesignificaRailssabecmorevertirelcambio
realizadoporestamigracin,encasodequedeseeinvertirenotromomento.Cuandoseejecutaesta
migracinsecrearunartculostablaconunacolumnadeserieyunacolumnadetexto.Tambincrea
doscamposdefechayhoraparapermitirRailspararastrearhorasdecreacindelartculoyde
actualizacin.
Paraobtenermsinformacinacercadelasmigraciones,consulteRailsMigracionesdebasesdedatos.
Enestepunto,sepuedeutilizaruncomandoderastrilloparaejecutarlamigracin:
$Bin/rakedb:migrate
Railsejecutarnestecomandomigracinydecirlesquecrelatablaartculos.
==CreateArticles:Migracin=============================================
=====
Create_table(:artculos)
>0.0019s
==CreateArticles:migrados(0.0020s)
=========================================
Debidoaqueustedesttrabajandoenelentornodedesarrollodeformapredeterminada,elcomandose
http://guides.rubyonrails.org/getting_started.html
23/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
aplicaralabasededatosdefinidaeneldesarrollodelaseccindesu
config/database.ymlarchivo.Sideseaejecutarmigracionesenotroambiente,porejemplo,enla
produccin,debepasarexplcitamentealinvocarelcomando:rakedb:migrateRAILS_ENV=
produccin.
5.6Guardardatosenelcontrolador
DevueltaenArticlesController,tenemosquecambiarlacreacindemedidasparautilizarelnuevo
artculomodeloparaguardarlosdatosenlabasededatos.Abrirapp/controllers/
articles_controller.rbycambiarelcrearaccionesparateneresteaspecto:
defcrear
@article=Artculo.nuevos(params[:artculo])
@article.save
redirect_toarticle
fin
Estoesloqueestpasando:todoslosmodelosdeRailssepuedeinicializarconsusrespectivosatributos,
queseasignanautomticamentealascolumnasdebasededatosrespectivas.Enlaprimeralneaque
hacemosjustamenteeso(recordarqueparams[:artculo]contienelosatributosquenosinteresan).
Entonces,@article.saveesresponsabledesalvarelmodeloenlabasededatos.Finalmente,
redirigimosalusuariodelademostracindeaccin,quedefiniremosmsadelante.
Comoveremosmsadelante,@article.savedevuelveunbooleanoqueindicasielartculosesalvo
no.
Siahoravaahttp://localhost:3000/artculos/nuevoustedcasipodrcrearunartculo.Prubalo!
Usteddebeobtenerunerrorquesepareceaesto:
Railstienevariascaractersticasdeseguridadqueleayudanaescribiraplicacionesseguras,yqueest
corriendoenunodeellosahora.Estesellamastrong_parameters,loquenosexigequeleRails
exactamentequparmetrosqueremosaceptarennuestroscontroladores.Enestecaso,queremospermitir
quelosttulosytextoparmetros,porloqueaadirelnuevoarticle_paramsmtodo,ycambiarsu
creacinaccindelcontroladorparausarlo,as:
http://guides.rubyonrails.org/getting_started.html
24/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
defcrear
@article=Artculo.nuevos(article_params)
@article.save
redirect_toarticle
fin
privado
defarticle_params
params.require(:artculo).permit(:ttulo,:texto)
fin
Verelpermiso?Senospermiteaceptartantottuloytextoenestaaccin.
Tengaencuentaquearticle_paramsdefesprivada.Estenuevoenfoqueevitaqueunatacante
establecerlosatributosdelmodelomanipulandoelhashpasadoalamodelo.Paraobtenermsinformacin,
consulteesteartculodeblogsobreParmetrosfuertes.
5.7Mostrandoartculos
Sienvaelformulariodenuevoahora,Railssequejandenoencontrarelprogramadeaccin.Esonoes
muytil,asquevamosaaadirelespectculodeaccinantesdeproceder.
http://guides.rubyonrails.org/getting_started.html
25/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Comohemosvistoenlasalidaderutasderastrillo,larutaparaelespectculodeaccinesel
siguiente:
artculoGET/articles/:id(.:format)artculos#show
Lasintaxisespecial:iddicerielesqueestarutaesperauna:idparmetro,queennuestrocasoserel
iddelartculo.
Comolohicimosantes,tenemosqueaadirelespectculodeaccinenapp/controllers/
articles_controller.rbysurespectivavista.
defespectculo
@article=Article.find(params[:id])
fin
Unpardecosasatenerencuenta.UtilizamosArticle.findparaencontrarelartculoquenosinteresa,
quepasaenparams[:id]paraobtenerel:Identificacindelparmetrodelapeticin.Tambin
utilizamosunavariabledeinstancia(elprefijo@)paramantenerunareferenciaalobjetoartculo.Hacemos
estoporqueRailsquepasatodaslasvariablesdeinstanciaalavista.
Ahora,creeunnuevoarchivoapp/views/artculos/show.html.erbconelsiguientecontenido:
<P>
<Strong>Ttulo:</strong>
<%=@Articulo.titulo%>
</P>
<P>
<Strong>texto</strong>
<%=@Article.text%>
</P>
http://guides.rubyonrails.org/getting_started.html
26/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Conestecambio,debefinalmentesercapazdecrearnuevosartculos.Visitehttp://localhost:3000/
articulos/nuevaydarleunaoportunidad!
5.8Listadodetodoslosartculos
Todavatenemosunamaneradeenumerartodosnuestros
artculos,porloquevamosahacereso.Larutaparaestecomo
porsalidaderutasderakees:
artculosGET/articles(.:format)artculosndice#
AadirelcorrespondientendicedeaccinparaeserecorridodentrodelaArticlesControllerenel
controladoresapp//articles_controller.rbarchivo:
defndice
articles=Article.all
fin
Y,porltimo,aadirlavistaparaestaaccin,queseencuentraenapp/views/artculos/
index.html.erb:
<H1>Artculosdeventa</
h1>
<Table>
<Tr>
<Th>Ttulo</th>
<Th>texto</th>
</Tr>
<%@Articles.eachhacer|artculo|%>
<Tr>
<Td><%=articulo.titulo%></td>
<Td><%=article.text%></td>
</Tr>
http://guides.rubyonrails.org/getting_started.html
27/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
<%Fin%>
</Table>
Ahorabien,siustedvaahttp://localhost:3000/artculos,verunalistadetodoslosartculos
queustedhacreado.
5.9Adicindeenlaces
Ahorapuedecrear,mostraryartculosdelalista.Ahoravamosaaadiralgunosenlacesparanavegarpor
pginas.
Abrirapp/views/bienvenidos/index.html.erbymodificandelasiguientemanera:
<H1>Hola,Rails!</H1>
<%=Link_to"Miblog',controlador:%'artculos'>
Ellink_tomtodoesunodeRailsincorporadosayudantesdevista.Secreaunhipervnculobasadoen
textoparamostrarydndeirenestecaso,alatrayectoriadelosartculos.
Vamosaaadirenlacesalosotrospuntosdevista,as,apartirdelaadicindeesteenlace"Nuevo
artculo"aapp/views/artculos/index.html.erb,porencimadela<table>etiqueta:
<%=link_to"Nuevoartculo",new_article_path%>
Esteenlacelepermitirabrirelformularioquetepermitecrearunnuevoartculo.
Tambinagregueunenlaceenapp/views/artculos/new.html.erb,pordebajodelaforma,para
volveralandicedelaaccin:
<%=form_for:artculo,url:articles_pathhacer|f|%>
...
http://guides.rubyonrails.org/getting_started.html
28/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
<%fin%>
<%=link_to'Volver',articles_path%>
Porltimo,aadirotroenlaceala/views/artculos/show.html.erbaplicacinplantillapara
volveralndicedelaacciny,porloquelaspersonasqueestnviendounsoloartculopuedevolver
atrsyverlalistacompletadenuevo:
<P>
<Strong>Ttulo:</strong>
<%=@Articulo.titulo%>
</P>
<P>
<Strong>texto</strong>
<%=@Article.text%>
</P>
<%=Link_to'Volver',articles_path%>
Siquieresenlazaraunaaccinenelmismocontrolador,noesnecesarioespecificarel:controlador
opcin,comoRailsutilizarelcontroladoractualdemanerapredeterminada.
Enelmododedesarrollo(queesloqueustedesttrabajandoenformapredeterminada),Railsvuelvea
cargarsuaplicacinconcadapeticindelnavegador,asquenohaynecesidaddedeteneryreiniciarel
servidorwebcuandosehaceuncambio.
5.10AdicinAlgunosValidacin
Elarchivodelmodelo,app/models/article.rbestansimplecomosepuedeconseguir:
claseartculo<ActiveRecord::Base
fin
http://guides.rubyonrails.org/getting_started.html
29/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
NohaymuchoaestearchivoperotengaencuentaqueelartculoclaseheredadeActiveRecord::
Base.ActiveRecordsuministraunagrancantidaddefuncionalidadasusmodelosRailsgratis,incluyendo
CRUDbsicadebasesdedatos(crear,leer,actualizar,Destroy)operaciones,validacindedatos,as
comounapoyosofisticadobsquedaylacapacidadderelacionarseconvariosmodelosentres.
Railsincluyemtodosparaayudaravalidarlosdatosqueustedenvealosmodelos.Abralaaplicacin
demodelos//article.rbarchivoyeditarlo:
claseartculo<ActiveRecord::Base
valida:ttulo,presencia:verdad,
longitud:{mnimo:5}
fin
Estoscambiosseasegurardequetodoslosartculostienenunttuloqueesalmenoscincocaracteres.
Carrilespuedenvalidarunavariedaddecondicionesenunmodelo,incluyendolapresenciaolasingularidad
decolumnas,suformato,ylaexistenciadeobjetosasociados.Validacionessetratanendetalleenactivos
ValidacionesdeRegistros
Conlavalidacinahoraensulugar,cuandosellama@article.saveenunartculonovlida,volver
falso.Siabreapp/controllers/articles_controller.rbotravez,tedarscuentadequeno
comprobamoselresultadodellamar@article.savedentrodelacreacindelaaccin.Si@
article.savefallaenestasituacin,tenemosquemostrarlaformadevueltaalusuario.Paraello,cambie
lanuevaycrearaccionesdentroapp/controllers/articles_controller.rbaestas:
defnuevo
@article=Artculo.nueva
fin
defcrear
@article=Artculo.nuevos(article_params)
siarticle.save
redirect_toarticle
ms
render"nuevo"
http://guides.rubyonrails.org/getting_started.html
30/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
fin
fin
privado
defarticle_params
params.require(:artculo).permit(:ttulo,:texto)
fin
Lanuevaaccinestcreandounanuevavariabledeinstanciallamadaarticle,yverporquesasen
pocosmomentos.
Ntesequeenelinteriordelcrearaccinqueutilizamoshacerenlugarderedirect_tocuandoahorro
retornosfalsos.Elrendermtodoseutilizaparaqueelarticleobjetosepasadenuevoalanueva
plantillacuandoserepresenta.Estarepresentacinserealizadentrodelamismapeticinqueelenvodel
formulario,mientrasqueelredirect_tolediralnavegadorparaemitirotrasolicitud.
Sivuelveacargarhttp://localhost:3000/articulos/nuevasytratardesalvaraunartculosinunttulo,
Railsleenviardenuevoalaforma,peroesonoesmuytil.Ustednecesitadecirlealusuariodequealgo
ibamal.Paraello,podrsmodificarapp/views/artculos/new.html.erbparacomprobarsihay
mensajesdeerror:
<%=Form_for:artculo,url:articles_pathhacer|f|%>
<%@Siarticle.errors.any?%>
<Divid="error_explanation">
<H2><%=pluralizar(@article.errors.count,"error")%>estprohibido
esteartculodesersalvos:</h2>
<Ul>
<%@Article.errors.full_messages.eachhacer|msg|%>
<Li><%=msg%></li>
<%Fin%>
</Ul>
</Div>
<%Fin%>
<P>
<%=F.label:%title><br>
<%=F.text_field:%title>
</P>
http://guides.rubyonrails.org/getting_started.html
31/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
<P>
<%=F.label:Texto%><br>
<%=F.text_area:Texto%>
</P>
<P>
<%=F.submit%>
</P>
<%Fin%>
<%=Link_to'Volver',articles_path%>
Algunascosasestnsucediendo.Comprobamossihayerrorescon@article.errors.any?,yenese
casosemuestraunalistadetodosloserrorescon@article.errors.full_messages.
pluralizaresunayudantecarrilesquetomaunnmeroyunacadenacomosusargumentos.Sielnmero
esmayorqueuno,lacadenasepluralizedautomticamente.
Laraznporlaquehemosaadido@article=Article.newenelArticlesControlleresquedelo
contrarioarticleseranulaennuestraopinin,yllamando@article.errors.any?lanzaraunerror.
Railsajustaautomticamenteloscamposquecontienenunerrorconundivconclasefield_with_errors
.SepuededefinirunareglaCSSparahacerlosdestacado.
Ahoraustedobtendrunmensajedeerroralguardarunbonitoartculosinttulocuandoseintentahacer
precisamenteesoenlanuevaformadeartculo(http://localhost:3000/articulos/nuevas).
5.11Actualizacindelosartculos
Hemoscubiertolapartede"CR"deCRUD.Ahoravamosacentrarnosenlapartede"U",laactualizacin
deartculos.
ElprimerpasovamosatomareslaadicindeunaedicinaccinalArticlesController.
defedicin
@article=Article.find(params[:id])
fin
http://guides.rubyonrails.org/getting_started.html
32/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Lavistacontieneunaformasimilaralaqueusamosalcrearnuevosartculos.Crearunarchivollamadoapp
/views/artculos/edit.html.erbyhacerqueseveadelasiguientemanera:
<H1>artculoEdicin</h1>
<%=Form_for:artculo,url:article_path(@article),mtodo::patch
hacer|f|%>
<%@Siarticle.errors.any?%>
<Divid="error_explanation">
<H2><%=pluralizar(@article.errors.count,"error")%>estprohibido
esteartculodesersalvos:</h2>
<Ul>
<%@Article.errors.full_messages.eachhacer|msg|%>
<Li><%=msg%></li>
<%Fin%>
</Ul>
</Div>
<%Fin%>
<P>
<%=F.label:%title><br>
<%=F.text_field:%title>
</P>
<P>
<%=F.label:Texto%><br>
<%=F.text_area:Texto%>
</P>
http://guides.rubyonrails.org/getting_started.html
33/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
<P>
<%=F.submit%>
</P>
<%Fin%>
<%=Link_to'Volver',articles_path%>
Estaveznossealanelformularioalaactualizacindelaaccin,quenoestdefinidotodava,pero
sermuypronto.
Elmtodo::patchopcinlediceaRailsquequeremosesteformularioparaserpresentadaatravsdela
PARCHEmtodoHTTPqueeselmtodoHTTPqueseesperaqueutiliceparaactualizarlosrecursosde
acuerdoconelprotocoloREST.
Elprimerparmetrodeform_forpuedeserunobjeto,porejemplo,@articleloquecausaralaayuda
pararellenarelformularioconloscamposdelobjeto.Pasandoenunsmbolo(:artculo)conelmismo
nombrequelavariabledeinstancia(@article)tambinconduceautomgicamentealamismaconducta.
Estoesloqueestpasandoaqu.Msdetallessepuedenencontrarenladocumentacinform_for.
Losiguientequenecesitamosparacrearlaactualizacindelaaccinenapp/controllers/
articles_controller.rb:
defactualizacin
@article=Article.find(params[:id])
siarticle.Update(article_params)
redirect_toarticle
ms
render'editar'
fin
fin
privado
defarticle_params
params.require(:artculo).permit(:ttulo,:texto)
fin
http://guides.rubyonrails.org/getting_started.html
34/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Elnuevomtodo,actualizacin,seutilizacuandosedeseaactualizarunregistroqueyaexiste,yse
aceptaunhashquecontienelosatributosquedeseaactualizar.Aligualqueantes,sihabaunerroral
actualizarelartculoqueremosmostrarlaformadevueltaalusuario.
Seutilizanlosarticle_paramsmtodoquehemosdefinidoanteriormenteparalaaccincreate.
Ustednonecesitapasartodoslosatributosparaactualizar.Porejemplo,siustedllamara@
article.update(ttulo:'Unnuevottulo')Railssloseraactualizarelttuloatributo,dejandoa
todoslosdemsatributosintactos.
Porltimo,queremosmostrarunenlacealaedicindelaaccinenlalistadetodoslosartculos,asque
vamosaaadirqueahoraaapp/views/artculos/index.html.erbparaqueaparezcajuntoal
enlace"Mostrar":
<Table>
<Tr>
<Th>Ttulo</th>
<Th>texto</th>
<Thcolspan="2"></th>
</Tr>
<%@Articles.eachhacer|artculo|%>
<Tr>
<Td><%=articulo.titulo%></td>
<Td><%=article.text%></td>
<Td><%=link_to'Mostrar',article_path(artculo)%></td>
<Td><%=link_to'Editar',edit_article_path(artculo)%></td>
</Tr>
<%Fin%>
</Table>
Ytambinaadiremosunaalaapp/views/artculos/show.html.erbplantillay,porloque
tambinhayunenlace"Editar"enlapginadeunartculo.Aadiresteenlaparteinferiordelaplantilla:
http://guides.rubyonrails.org/getting_started.html
35/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
...
<%=Link_to'Volver',articles_path%>
|<%=Link_to'Editar',edit_article_path(@article)%>
Yasescomonuestraaplicacinsevehastaelmomento:
5.12Usodelos
parcialesparalimpiar
laduplicacinenlas
vistas
Nuestraeditarpginaseve
muysimilaralanuevapgina,
dehechoamboscompartenel
mismocdigoparala
visualizacindelaforma.
Vamosaquitaralguna
duplicacinutilizandounavista
parcial.Porconvencin,los
archivosparcialestienencomo
prefijounguinbajo.
PuedeleermsacercadelosparcialesenlosLayoutsyrenderizadoenRailsgua.
Crearunnuevoarchivoapp/views/artculos/_form.html.erbconelsiguientecontenido:
<%=Form_forarticlehacer|f|%>
<%@Siarticle.errors.any?%>
<Divid="error_explanation">
<H2><%=pluralizar(@article.errors.count,"error")%>estprohibido
esteartculodesersalvos:</h2>
<Ul>
<%@Article.errors.full_messages.eachhacer|msg|%>
<Li><%=msg%></li>
<%Fin%>
http://guides.rubyonrails.org/getting_started.html
36/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
</Ul>
</Div>
<%Fin%>
<P>
<%=F.label:%title><br>
<%=F.text_field:%title>
</P>
<P>
<%=F.label:Texto%><br>
<%=F.text_area:Texto%>
</P>
<P>
<%=F.submit%>
</P>
<%Fin%>
Todo,exceptoparaelform_fordeclaracinsiguesiendoelmismo.Laraznporlaquepodemosutilizar
estemscortoysencilloform_fordeclaracinparasustituiracualquieradelasotrasformasesque
articleesunrecursoquecorrespondeaunconjuntocompletoderutasRESTful,yRailsescapazde
inferirqueURIyelmtodoautilizar.Paraobtenermsinformacinacercadeesteusodeform_for,
consulteestiloorientadoarecursos.
Ahora,vamosaactualizarlaapp/views/artculos/new.html.erbfindeutilizarestanuevaparcial,
reescribirporcompleto:
<H1>Nuevoartculo</h1>
<%=Render"forma"%>
<%=Link_to'Volver',articles_path%>
Luegohacerlomismoparaelapp/views/artculos/edit.html.erbvista:
http://guides.rubyonrails.org/getting_started.html
37/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
<H1>Editarartculo</h1>
<%=Render"forma"%>
<%=Link_to'Volver',articles_path%>
5.13Eliminacindelosartculos
Ahoraestamoslistosparacubrirlapartede"D"deCRUD,eliminarlosartculosdelabasededatos.
SiguiendolaconvencinREST,larutaparaborrarartculoscomoporsalidaderutasderakees:
BORRAR/artculos/:id(.:formato)artculos#destroy
Laeliminacinmtododeenrutamientosedebeutilizarparalasrutasquedestruyenlosrecursos.Siesto
sedejacomountpicogetruta,podraserposiblequelaspersonasalasembarcacionesdeURLs
maliciosascomoesto:
<ahref='http://example.com/articles/1/destroy'>miraraestegato!
</a>
Usamoslaeliminacinmtodoparadestruirlosrecursos,yestarutaseasignaaldestruirlaaccin
dentrodeapp/controllers/articles_controller.rb,queannoexiste,peroseproporcionaa
continuacin:
defdestruir
@article=Article.find(params[:id])
@article.destroy
articles_pathredirect_to
fin
http://guides.rubyonrails.org/getting_started.html
38/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
UstedpuedellamaradestruirenobjetosActiveRecordcuandodeseaeliminarlosdelabasededatos.
Tengaencuentaquenoesnecesarioaadirunavistaparaestaaccinyaqueestamosredirigiendoal
ndicedelaaccin.
Porltimo,aadirunenlace'Destroy'atundicedeplantilladeaccin(app/views/artculos/
index.html.erb)paraenvolvertodojunto.
<H1>Artculosdeventa</
h1>
<'Nuevoartculo'%=link_to,new_article_path%>
<Table>
<Tr>
<Th>Ttulo</th>
<Th>texto</th>
<Thcolspan="3"></th>
</Tr>
<%@Articles.eachhacer|artculo|%>
<Tr>
<Td><%=articulo.titulo%></td>
<Td><%=article.text%></td>
<Td><%=link_to'Mostrar',article_path(artculo)%></td>
<Td><%=link_to'Editar',edit_article_path(artculo)%></td>
<Td><%=link_to'Destroy',article_path(artculo),
Mtodo::eliminar,losdatos:{confirmar:'Est
seguro?"}%></Td>
</Tr>
<%Fin%>
</Table>
Aquestamosusandolink_todeunamaneradiferente.Pasamoslarutadenominadacomosegundo
argumento,yluegolasopcionescomootroargumento.El:mtodoy:"datosconfirmarlasopciones
seutilizancomoHTML5atributos,deformaquecuandosehaceclicenelenlace,Railsprimeromostrar
uncuadrodedilogodeconfirmacinparaelusuarioy,acontinuacin,enviarelenlaceconelmtodode
eliminar.EstosehaceatravsdelosarchivosdeJavaScriptjquery_ujsqueseincluye
automticamenteeneldiseodelaaplicacin(app/views/layouts/application.html.erb)al
generarlaaplicacin.Sinestearchivo,noapareceraelcuadrodedilogodeconfirmacin.
http://guides.rubyonrails.org/getting_started.html
39/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Enhorabuena,ahorapuedecrear,mostrar,lista,actualizarydestruirartculos.
Engeneral,Railsfomentaelusodeobjetosderecursosenlugardedeclararrutasmanualmente.Para
obtenermsinformacinacercadelenrutamiento,consulteRailsenrutamientodeafuerahaciaadentro.
6Adicindeunsegundomodelo
Eselmomentodeaadirunsegundomodeloalaaplicacin.Elsegundomodeloseencargardelos
comentariossobrelosartculos.
6.1GeneracindeunModelo
Vamosaverelmismogeneradorquehemosutilizadoantesdelahoradecrearelartculomodelo.Esta
vezvamosacrearuncomentariomodeloparamantenerlareferenciadeloscomentariosdelartculo.
Ejecuteestecomandoenelterminal:
$Bin/rielesgeneranmodelocomentarioComentario:cuerpodelacadena:
Artculo:referencias
http://guides.rubyonrails.org/getting_started.html
40/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Estecomandogenerarcuatroarchivos:
Expediente
Propsito
db/migrate/
20140120201010_create_comments.rb
Migracinparacrearlatablacomentariosensubasededatos
(sunombreincluirunamarcadetiempodiferente)
app/models/comment.rb
Elmodelocomentario
prueba/modelos/comment_test.rb
Pruebadearnsparaelmodelodeloscomentarios
test/fixtures/comments.yml
Comentariosdeejemploparasuusoenpruebas
Expediente
db/migrate/20140120201010_create_comments.rb
app/models/comment.rb
prueba/modelos/comment_test.rb
test/fixtures/comments.yml
Enprimerlugar,echeunvistazoaapp/models/comment.rb:
clasecomentario<ActiveRecord::Base
belongs_to:artculo
fin
Estoesmuysimilaraladelartculomodeloquevisteantes.Ladiferenciaestenlalneabelongs_to:
artculo,queestableceunregistroactivoasociacin.Vasaaprenderunpocoacercadelas
http://guides.rubyonrails.org/getting_started.html
41/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
asociacionesenlasiguienteseccindeestagua.
Ademsdelmodelo,rielestambinhahechounamigracinacrearlatabladebasededatos
correspondiente:
claseCreateComments<ActiveRecord::Migracin
defcambio
create_table:comentarioshacen|t|
t.string:comentarista
t.text:cuerpo
#Estalneaaadeunacolumnaenterallamada`article_id`.
t.references:artculo,ndice:verdaderos
t.timestamps
fin
fin
fin
Elt.referenceslneaconfiguraunacolumnadeclaveexternaparalaasociacinentrelosdosmodelos.
Tambinsecreaunndiceparaestaasociacinenestacolumna.Seguiradelanteyejecutarlamigracin:
$Bin/rakedb:migrate
Railseslosuficientementeinteligentecomoparasloejecutarlasmigracionesqueannolohayanhecho
funcionarencontradelabasededatosactual,porloqueenestecaso,ustedslover:
==CreateComments:Migracin=============================================
====
Create_table(:Comentarios)
>0.0115s
==CreateComments:migrados(0.0119s)
========================================
http://guides.rubyonrails.org/getting_started.html
42/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
6.2ModelosAsociar
AsociacionesActiveRecordpermitendeclararfcilmentelarelacinentredosmodelos.Enelcasodelos
comentariosyartculos,ustedpodraescribirlasrelacionesdeestamanera:
Cadacomentarioperteneceaunartculo.
Unartculopuedetenermuchoscomentarios.
Dehecho,estoestmuycercadelasintaxisqueRailsutilizaparadeclararestaasociacin.Yahasvistola
lneadecdigodentrodelcomentariomodelo(app/models/comment.rb)quehacequecadacomentario
perteneceraunartculo:
clasecomentario<ActiveRecord::Base
belongs_to:artculo
fin
Tendrqueeditarapp/models/article.rbaadirelotroladodelaasociacin:
claseartculo<ActiveRecord::Base
has_many:comentarios
valida:ttulo,presencia:verdad,
longitud:{mnimo:5}
fin
Estasdosdeclaracionespermitenunbuenpocodecomportamientoautomtico.Porejemplo,siustedtiene
unavariabledeinstanciaarticlecontieneunartculo,puederecuperartodosloscomentariosque
pertenecenaeseartculocomounamatrizusando@article.comments.
ParaobtenermsinformacinsobrelasasociacionesActiveRecord,verelActivoAsociacionesde
Registrosgua.
6.3AdicindeunarutadeComentarios
Aligualqueconlabienvenidacontrolador,tendremosqueagregarunarutaparaqueRailssabedndenos
http://guides.rubyonrails.org/getting_started.html
43/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
gustaranavegarparaverloscomentarios.Abrelaconfig/routes.rbarchivodenuevo,yeditarla
siguientemanera:
Recursos:artculoshacen
Recursos:comentarios
fin
Estocrealoscomentarioscomounrecursoanidadodentrodelosartculos.Estaesotrapartedela
capturadelarelacinjerrquicaqueexisteentrelosartculosycomentarios.
Paraobtenermsinformacinsobreelenrutamiento,consultelaRailsenrutamientogua.
6.4Generacindeuncontrolador
Conelmodeloenlamano,ustedpuededarvueltaasuatencinalacreacindeuncontroladordejuego.
Unavezms,vamosautilizarelmismogeneradorqueusamosantes:
$Bin/rielesgenerancontroladorComentarios
Estocreaseisarchivosyundirectoriovaco:
Archivo/Directorio
Propsito
app/controllers/comments_controller.rb
ElcontroladorComentarios
app/views/comentarios/
Vistasdelcontroladorsealmacenanaqu
prueba/controllers/comments_controller_test.rb
Lapruebaparaelcontrolador
app/helpers/comments_helper.rb
Unarchivodeayudantedevista
prueba/helpers/comments_helper_test.rb
Lapruebaparaelayudante
http://guides.rubyonrails.org/getting_started.html
44/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
app/assets/javascripts/comment.js.coffee
CoffeeScriptparaelcontrolador
app/assets/hojasdeestilo/comment.css.scss
Hojadeestilosencascadaparaelcontrolador
Archivo/Directorio
app/controllers/comments_controller.rb
app/views/comentarios/
prueba/controllers/comments_controller_test.rb
app/helpers/comments_helper.rb
prueba/helpers/comments_helper_test.rb
app/assets/javascripts/comment.js.coffee
app/assets/hojasdeestilo/comment.css.scss
Aligualqueconcualquierblog,nuestroslectorespodrncrearsuscomentariosdirectamentedespusde
leerelartculo,yunavezquehanaadidosucomentario,seenviardenuevoalapginadelartculo
espectculodeverasucomentarioquefiguraahora.Debidoaesto,nuestraCommentsControllerestah
paraproporcionarunmtodoparacrearcomentariosyeliminarloscomentariosspamcuandollegan.
Asqueprimero,vamosacablehastalaplantillaArtculoespectculo(app/views/artculos/
show.html.erb)paradejarnoshacerunnuevocomentario:
<P>
<Strong>Ttulo:</strong>
<%=@Articulo.titulo%>
</P>
http://guides.rubyonrails.org/getting_started.html
45/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
<P>
<Strong>texto</strong>
<%=@Article.text%>
</P>
<H2>Aadiruncomentario:</h2>
<%=Form_for([@artculo,@article.comments.build])hacer|f|%>
<P>
<%=F.label:comentarista%><br>
<%=F.text_field:comentarista%>
</P>
<P>
<%=F.label:cuerpo%><br>
<%=F.text_area:cuerpo%>
</P>
<P>
<%=F.submit%>
</P>
<%Fin%>
<%=Link_to'Volver',articles_path%>
|<%=Link_to'Editar',edit_article_path(@article)%>
Estoagregaunformularioenelartculopginaespectculoquecreaunnuevocomentariollamandoal
CommentsControllercrearaccin.Elform_forllamadaaquutilizaunamatriz,queconstruirunaruta
anidada,como/artculos/1/comentarios.
Vamosacablearloscreanenapp/controllers/comments_controller.rb:
claseCommentsController<ApplicationController
defcrear
@article=Article.find(params[:article_id])
comment=@article.comments.create(comment_params)
article_pathredirect_to(@article)
fin
privado
defcomment_params
params.require(:comentario).permit(:comentarista,:cuerpo)
http://guides.rubyonrails.org/getting_started.html
46/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
fin
fin
Ustedverunpocomsdecomplejidadaqudeloquehizoenelcontroladorparalosartculos.Esoesun
efectosecundariodelaanidacinqueustedhaconfigurado.Cadasolicituddecomentariotienequeseguir
lapistadelartculoalqueseuneelcomentario,aslallamadainicialaldescubrimientomtododel
artculomodeloparaobtenerelartculoencuestin.
Adems,elcdigoseaprovechadealgunosdelosmtodosdisponiblesparaunaasociacin.Usamosla
creacindemtodoen@article.commentsparacrearyguardarelcomentario.Estoenlazar
automticamenteelcomentarioparaqueperteneceaeseartculoenparticular.
Unavezquehemoshechoelcomentario,seenviaralusuariovolveralartculooriginalutilizandoel
article_path(@article)ayudante.Comoyahemosvisto,estellamaalprogramadeaccindela
ArticlesControllerqueasuvezhacequelashow.html.erbplantilla.Aquesdondequeremosqueel
comentarioparamostrar,asquevamosaaadirquealaapp/views/artculos/show.html.erb.
<P>
<Strong>Ttulo:</strong>
<%=@Articulo.titulo%>
</P>
<P>
<Strong>texto</strong>
<%=@Article.text%>
</P>
<H2>Comentarios</h2>
<%@Article.comments.eachhacer|Comentar|%>
<P>
<Strong>Comentario:</strong>
<%=Comment.commenter%>
</P>
<P>
<Strong>Comentario:</strong>
<%=Comment.body%>
http://guides.rubyonrails.org/getting_started.html
47/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
</P>
<%Fin%>
<H2>Aadiruncomentario:</h2>
<%=Form_for([@artculo,@article.comments.build])hacer|f|%>
<P>
<%=F.label:comentarista%><br>
<%=F.text_field:comentarista%>
</P>
<P>
<%=F.label:cuerpo%><br>
<%=F.text_area:cuerpo%>
</P>
<P>
<%=F.submit%>
</P>
<%Fin%>
<%=Link_to'Modificarelartculo',edit_article_path(@article)%>|
<%=Link_to'Volveralosartculos',articles_path%>
Ahorapuedeagregarartculosycomentariosasublogyhacerqueaparezcanenloslugarescorrectos.
7Refactoring
Ahoraquetenemosartculosycomentariosdetrabajo,echarunvistazoael/views/artculos/
show.html.erbaplicacinplantilla.Cadavezesmslargoytorpe.Podemosutilizarlosparcialespara
limpiarlo.
7.1RepresentacinparcialesColecciones
Enprimerlugar,vamosahaceruncomentarioparcialparaextraermuestratodosloscomentariosparael
artculo.Creeelarchivoapp/views/comentarios/_comment.html.erbyponerelsiguienteenl:
http://guides.rubyonrails.org/getting_started.html
48/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
<P>
<Strong>Comentario:</strong>
<%=Comment.commenter%>
</P>
<P>
<Strong>Comentario:</strong>
<%=Comment.body%>
http://guides.rubyonrails.org/getting_started.html
49/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
</P>
Acontinuacin,puedecambiarapp/views/artculos/show.html.erbparaparecersealo
siguiente:
<P>
<Strong>Ttulo:</strong>
<%=@Articulo.titulo%>
</P>
<P>
<Strong>texto</strong>
<%=@Article.text%>
</P>
<H2>Comentarios</h2>
<%=Rendir@article.comments%>
<H2>Aadiruncomentario:</h2>
<%=Form_for([@artculo,@article.comments.build])hacer|f|%>
<P>
<%=F.label:comentarista%><br>
<%=F.text_field:comentarista%>
</P>
<P>
<%=F.label:cuerpo%><br>
<%=F.text_area:cuerpo%>
</P>
<P>
<%=F.submit%>
</P>
<%Fin%>
<%=Link_to'Modificarelartculo',edit_article_path(@article)%>|
<%=Link_to'Volveralosartculos',articles_path%>
Estoahoraharqueelparcialenapp/views/comentarios/_comment.html.erbunavezporcada
comentarioqueestenel@article.commentscoleccin.Amedidaqueelrenderserepiteelmtodo@
http://guides.rubyonrails.org/getting_started.html
50/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
article.commentscoleccin,seasignaacadacomentarioaunavariablelocalconelmismonombrequeel
parcial,enestecaso,comentarioquepasaaestardisponibleenelparcialparanosotrosparamostrar.
7.2Representacindeformaparcial
Tambindebemosavanzarquelanuevaseccindecomentariosasupropioparcial.Unavezms,secrea
unarchivoapp/views/comentarios/_form.html.erbquecontiene:
<%=Form_for([@artculo,@article.comments.build])hacer|f|%>
<P>
<%=F.label:comentarista%><br>
<%=F.text_field:comentarista%>
</P>
<P>
<%=F.label:cuerpo%><br>
<%=F.text_area:cuerpo%>
</P>
<P>
<%=F.submit%>
</P>
<%Fin%>
Luegodehacerlasapp/views/artculos/show.html.erbsersimilaralsiguiente:
<P>
<Strong>Ttulo:</strong>
<%=@Articulo.titulo%>
</P>
<P>
<Strong>texto</strong>
<%=@Article.text%>
</P>
<H2>Comentarios</h2>
<%=Rendir@article.comments%>
http://guides.rubyonrails.org/getting_started.html
51/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
<H2>Aadiruncomentario:</h2>
<%=Hacer"comentarios/formulario"%>
<%=Link_to'Modificarelartculo',edit_article_path(@article)%>|
<%=Link_to'Volveralosartculos',articles_path%>
Elsegundorenderslodefinelaplantillaparcialqueremosrendir,comentarios/formulario.Railseslo
suficientementeinteligentecomoparadetectarlabarradiagonalenesacadenaydarsecuentadeque
deseaprocesarla_form.html.erbarchivoenlavistaapp//comentariosdirectorio.
Elarticleobjetoestdisponibleparacualquierparcialesprestadosenlavistaporquelodefinimoscomo
unavariabledeinstancia.
8EliminacinComentarios
Otracaractersticaimportantedeunblogessercapazdeeliminarloscomentariosspam.Paraello,
necesitamosimplementarunenlacedealgntipoenlavistayunadestruiraccinenel
CommentsController.
Asqueprimero,vamosaaadirelenlacedeborradoenlaapp/views/comentarios/
_comment.html.erbparcial:
<P>
<Strong>Comentario:</strong>
<%=Comment.commenter%>
</P>
<P>
<Strong>Comentario:</strong>
<%=Comment.body%>
</P>
<P>
<%=Link_to'Destroycomentario',[comment.article,comentario],
Mtodo::eliminar,
datos:{confirmar:'Estseguro?"}%>
</P>
http://guides.rubyonrails.org/getting_started.html
52/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Alhacerclicenestanueva"Destruyecomentario"enlacesedispararunDELETE/artculos/:
article_id/comentarios/:idanuestroCommentsController,queluegopuedenutilizarestopara
encontrarelcomentarioquequeremoseliminar,asquevamosaaadirundestruyenaccinanuestro
controlador(app/controllers/comments_controller.rb):
claseCommentsController<ApplicationController
defcrear
@article=Article.find(params[:article_id])
comment=@article.comments.create(comment_params)
article_pathredirect_to(@article)
fin
defdestruir
@article=Article.find(params[:article_id])
comment=@article.comments.find(params[:id])
comment.destroy
article_pathredirect_to(@article)
fin
privado
defcomment_params
params.require(:comentario).permit(:comentarista,:cuerpo)
fin
fin
Eldestruirlaaccinseencuentraelartculoqueestamosviendo,localizarelcomentariodentrodela@
article.commentscoleccin,yluegoretrelodelabasededatosyenviarnosdevueltaalaaccin
espectculoparaelartculo.
8.1Eliminacindeobjetosasociados
Sieliminaunartculoentoncestambintendrquesereliminadosuscomentariosasociados.Delo
contrario,quesloserviranparaocuparespacioenlabasededatos.Railslepermiteutilizarel
dependienteopcindeunaasociacinparalograrlo.Modificarelartculomodelo,app/modelos/
article.rb,comosigue:
http://guides.rubyonrails.org/getting_started.html
53/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
claseartculo<ActiveRecord::Base
has_many:comentarios,dependiente::destruir
valida:ttulo,presencia:verdad,
longitud:{mnimo:5}
fin
9Seguridad
9.1Autenticacinbsica
Sisevaapublicarsublogenlnea,nadieseracapazdeaadir,editaryeliminarartculosoeliminarlos
comentarios.
RailsproporcionaunsistemadeautenticacinHTTPmuysimplequefuncionarmuybienenesta
situacin.
EnelArticlesControllertenemosquetenerunamaneradebloquearelaccesoalasdistintasaccionessi
lapersonanoestautenticado,aqupodemosutilizarlosrieleshttp_basic_authenticate_withmtodo,
permitiendoelaccesoalaaccinsolicitadasiesemtodolopermite.
Parautilizarelsistemadeautenticacin,loespecificamosenlapartesuperiordenuestra
ArticlesController,enestecaso,queremosqueelusuarioseautentiqueencadaaccin,conexcepcin
dendiceyespectculo,porloqueescribimosqueenapp/controllers/articles_controller.rb
:
claseArticlesController<ApplicationController
http_basic_authenticate_withnombre:"DHH",contrasea:"secreto",
excepto:[:index,:mostrar]
defndice
articles=Article.all
fin
#Snippedporbrevedad
http://guides.rubyonrails.org/getting_started.html
54/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
Tambinqueremospermitirqueslolosusuariosautenticadosdeeliminarloscomentarios,porloqueenel
CommentsController(app/controllers/comments_controller.rb)escribimos:
claseCommentsController<ApplicationController
http_basic_authenticate_withnombre:"DHH",contrasea:"secreto",
slo::destruir
defcrear
@article=Article.find(params[:article_id])
...
fin
#Snippedporbrevedad
Ahorabien,siseintentacrearunnuevoartculo,queserrecibidoconunretobsicodeautenticacin
HTTP
OtrosmtodosdeautenticacinestndisponiblesparaaplicacionesRails.Dosdeautenticacin
complementospopularesparaRailssonlaDeviserielesdelmotorylaAuthlogicjoya,juntoconunnmero
deotros.
9.2OtrasConsideracionesdeSeguridad
Seguridad,especialmenteenaplicacionesweb,esunazonaampliaydetallada.Seguridadenlaaplicacin
desusrielessetrataconmsprofundidadenelRubyonRailsGuadeseguridad
10Qusigue?
AhoraqueustedhavistosuprimeraaplicacinRails,usteddebesentirselibreparaactualizarloy
experimentarporsucuenta.Peroustednotienequehacerlotodosinayuda.Comoustednecesitaayuda
paralevantarseycorrerconRails,nodudeenconsultarestosrecursosdeapoyo:
http://guides.rubyonrails.org/getting_started.html
55/56
28/11/2014
PrimerospasosconRailsRubyonRailsGuas
ElRubyonRailsguas
ElRubyonRailsTutorial
ElRubyonRailslistadecorreo
El#rubyonrailscanalenirc.freenode.net
Railstambinvieneconunafuncindeayudaquesepuedegenerarmediantelautilidadrastrillodelneade
comandos:
Correrdocrastrillo:guaspondrnunacopiacompletadelasGuasdeRailseneldoc/
guascarpetadesuaplicacin.Abrirdoc/guas/index.htmlensunavegadorwebpara
explorarlasGuas.
Correrdocrastrillo:carrilespondrunacopiacompletadeladocumentacindelaAPIde
Railseneldoc/apicarpetadesuaplicacin.Abrirdoc/api/index.htmlensunavegador
webparaexplorarladocumentacindelaAPI.
ParasercapazdegenerarlasGuasRailslocalmenteconeldoc:guasrastrillotareaesnecesarioinstalar
http://guides.rubyonrails.org/getting_started.html
56/56