Sunteți pe pagina 1din 56

28/11/2014

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

S-ar putea să vă placă și