181
Ruby on Rails: la revoluci´ on del desarrollo web Esteban Manchado Vel´ azquez [email protected] 15 de mayo de 2006

Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ruby on Rails: la revolucion del desarrollo web

Esteban Manchado [email protected]

15 de mayo de 2006

Page 2: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Indice

1 IntroduccionLa revolucion del desarrollo webMVCOtras comodidades

2 Cada componente en detalleActiveRecordActionPackEnlaces

Page 3: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Indice

1 IntroduccionLa revolucion del desarrollo webMVCOtras comodidades

2 Cada componente en detalleActiveRecordActionPackEnlaces

Page 4: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Desarrollo web tradicional

• Separacion de conceptos

• Duplicacion de codigo

• Por separado, ((maduro)), pero no muy bien integrado

• MVC de moda ultimamente

• Hay poca cosa preparada para la Web 2.0

Page 5: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Desarrollo web tradicional

• Separacion de conceptos

• Duplicacion de codigo

• Por separado, ((maduro)), pero no muy bien integrado

• MVC de moda ultimamente

• Hay poca cosa preparada para la Web 2.0

Page 6: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Desarrollo web tradicional

• Separacion de conceptos

• Duplicacion de codigo

• Por separado, ((maduro)), pero no muy bien integrado

• MVC de moda ultimamente

• Hay poca cosa preparada para la Web 2.0

Page 7: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Desarrollo web tradicional

• Separacion de conceptos

• Duplicacion de codigo

• Por separado, ((maduro)), pero no muy bien integrado

• MVC de moda ultimamente

• Hay poca cosa preparada para la Web 2.0

Page 8: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Desarrollo web tradicional

• Separacion de conceptos

• Duplicacion de codigo

• Por separado, ((maduro)), pero no muy bien integrado

• MVC de moda ultimamente

• Hay poca cosa preparada para la Web 2.0

Page 9: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Nacimiento de RoR

• David Heinemeier Hansson (Dinamarca)

• Esta loco

• Programaba en PHP

(me estoy repitiendo)

• Intento escribir Rails en PHP...

• ...pero fracaso miserablemente

• Necesitaba algo mas

• Un amigo le habıa nombrado Ruby y...

• ...ahora todos se quieren copiar...

• ...¡incluso en PHP!

Page 10: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Nacimiento de RoR

• David Heinemeier Hansson (Dinamarca)

• Esta loco

• Programaba en PHP

(me estoy repitiendo)

• Intento escribir Rails en PHP...

• ...pero fracaso miserablemente

• Necesitaba algo mas

• Un amigo le habıa nombrado Ruby y...

• ...ahora todos se quieren copiar...

• ...¡incluso en PHP!

Page 11: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Nacimiento de RoR

• David Heinemeier Hansson (Dinamarca)

• Esta loco

• Programaba en PHP

(me estoy repitiendo)

• Intento escribir Rails en PHP...

• ...pero fracaso miserablemente

• Necesitaba algo mas

• Un amigo le habıa nombrado Ruby y...

• ...ahora todos se quieren copiar...

• ...¡incluso en PHP!

Page 12: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Nacimiento de RoR

• David Heinemeier Hansson (Dinamarca)

• Esta loco

• Programaba en PHP (me estoy repitiendo)

• Intento escribir Rails en PHP...

• ...pero fracaso miserablemente

• Necesitaba algo mas

• Un amigo le habıa nombrado Ruby y...

• ...ahora todos se quieren copiar...

• ...¡incluso en PHP!

Page 13: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Nacimiento de RoR

• David Heinemeier Hansson (Dinamarca)

• Esta loco

• Programaba en PHP (me estoy repitiendo)

• Intento escribir Rails en PHP...

• ...pero fracaso miserablemente

• Necesitaba algo mas

• Un amigo le habıa nombrado Ruby y...

• ...ahora todos se quieren copiar...

• ...¡incluso en PHP!

Page 14: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Nacimiento de RoR

• David Heinemeier Hansson (Dinamarca)

• Esta loco

• Programaba en PHP (me estoy repitiendo)

• Intento escribir Rails en PHP...

• ...pero fracaso miserablemente

• Necesitaba algo mas

→• Un amigo le habıa nombrado Ruby y...

• ...ahora todos se quieren copiar...

• ...¡incluso en PHP!

Page 15: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Nacimiento de RoR

• David Heinemeier Hansson (Dinamarca)

• Esta loco

• Programaba en PHP (me estoy repitiendo)

• Intento escribir Rails en PHP...

• ...pero fracaso miserablemente

• Necesitaba algo mas →

• Un amigo le habıa nombrado Ruby y...

• ...ahora todos se quieren copiar...

• ...¡incluso en PHP!

Page 16: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Nacimiento de RoR

• David Heinemeier Hansson (Dinamarca)

• Esta loco

• Programaba en PHP (me estoy repitiendo)

• Intento escribir Rails en PHP...

• ...pero fracaso miserablemente

• Necesitaba algo mas →• Un amigo le habıa nombrado Ruby y...

• ...ahora todos se quieren copiar...

• ...¡incluso en PHP!

Page 17: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Nacimiento de RoR

• David Heinemeier Hansson (Dinamarca)

• Esta loco

• Programaba en PHP (me estoy repitiendo)

• Intento escribir Rails en PHP...

• ...pero fracaso miserablemente

• Necesitaba algo mas →• Un amigo le habıa nombrado Ruby y...

• ...ahora todos se quieren copiar...

• ...¡incluso en PHP!

Page 18: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Nacimiento de RoR

• David Heinemeier Hansson (Dinamarca)

• Esta loco

• Programaba en PHP (me estoy repitiendo)

• Intento escribir Rails en PHP...

• ...pero fracaso miserablemente

• Necesitaba algo mas →• Un amigo le habıa nombrado Ruby y...

• ...ahora todos se quieren copiar...

• ...¡incluso en PHP!

Page 19: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Los cinco pilares del Islam^WRails

• Productividad maxima

• Sentido estetico

• Herramientas mas o menos buenas...

• ...muy bien integradas (todo > partes)

• Simplicidad, DRY (Don’t Repeat Yourself)

• ¡Abajo la configuracion, arriba las convenciones!

Page 20: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Los cinco pilares del Islam^WRails

• Productividad maxima

• Sentido estetico

• Herramientas mas o menos buenas...

• ...muy bien integradas (todo > partes)

• Simplicidad, DRY (Don’t Repeat Yourself)

• ¡Abajo la configuracion, arriba las convenciones!

Page 21: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Los cinco pilares del Islam^WRails

• Productividad maxima

• Sentido estetico

• Herramientas mas o menos buenas...

• ...muy bien integradas (todo > partes)

• Simplicidad, DRY (Don’t Repeat Yourself)

• ¡Abajo la configuracion, arriba las convenciones!

Page 22: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Los cinco pilares del Islam^WRails

• Productividad maxima

• Sentido estetico

• Herramientas mas o menos buenas...

• ...muy bien integradas (todo > partes)

• Simplicidad, DRY (Don’t Repeat Yourself)

• ¡Abajo la configuracion, arriba las convenciones!

Page 23: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Los cinco pilares del Islam^WRails

• Productividad maxima

• Sentido estetico

• Herramientas mas o menos buenas...

• ...muy bien integradas (todo > partes)

• Simplicidad, DRY (Don’t Repeat Yourself)

• ¡Abajo la configuracion, arriba las convenciones!

Page 24: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Los cinco pilares del Islam^WRails

• Productividad maxima

• Sentido estetico

• Herramientas mas o menos buenas...

• ...muy bien integradas (todo > partes)

• Simplicidad, DRY (Don’t Repeat Yourself)

• ¡Abajo la configuracion, arriba las convenciones!

Page 25: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Indice

1 IntroduccionLa revolucion del desarrollo webMVCOtras comodidades

2 Cada componente en detalleActiveRecordActionPackEnlaces

Page 26: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

MVC a grandes rasgos

• Modelo, Vista y Controlador

• Modelo para los datos

• Vista para la interfaz (HTML en este caso)

• Controlador para

• De invencion bastante reciente

• Muy popular actualmente para plataformas de desarrollo web

Page 27: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

MVC a grandes rasgos

• Modelo, Vista y Controlador

• Modelo para los datos

• Vista para la interfaz (HTML en este caso)

• Controlador para

• De invencion bastante reciente

• Muy popular actualmente para plataformas de desarrollo web

Page 28: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

MVC a grandes rasgos

• Modelo, Vista y Controlador

• Modelo para los datos

• Vista para la interfaz (HTML en este caso)

• Controlador para

• De invencion bastante reciente

• Muy popular actualmente para plataformas de desarrollo web

Page 29: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

MVC a grandes rasgos

• Modelo, Vista y Controlador

• Modelo para los datos

• Vista para la interfaz (HTML en este caso)

• Controlador para

• De invencion bastante reciente

• Muy popular actualmente para plataformas de desarrollo web

Page 30: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

MVC a grandes rasgos

• Modelo, Vista y Controlador

• Modelo para los datos

• Vista para la interfaz (HTML en este caso)

• Controlador para atraerlos a todos y atarlos a las... errhhh

• De invencion bastante reciente

• Muy popular actualmente para plataformas de desarrollo web

Page 31: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

MVC a grandes rasgos

• Modelo, Vista y Controlador

• Modelo para los datos

• Vista para la interfaz (HTML en este caso)

• Controlador para hacer calculos y unir todas las piezas

• De invencion bastante reciente

• Muy popular actualmente para plataformas de desarrollo web

Page 32: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

MVC a grandes rasgos

• Modelo, Vista y Controlador

• Modelo para los datos

• Vista para la interfaz (HTML en este caso)

• Controlador para hacer calculos y unir todas las piezas

• De invencion bastante reciente

• Muy popular actualmente para plataformas de desarrollo web

Page 33: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

MVC a grandes rasgos

• Modelo, Vista y Controlador

• Modelo para los datos

• Vista para la interfaz (HTML en este caso)

• Controlador para hacer calculos y unir todas las piezas

• De invencion bastante reciente (1979)

• Muy popular actualmente para plataformas de desarrollo web

Page 34: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

MVC a grandes rasgos

• Modelo, Vista y Controlador

• Modelo para los datos

• Vista para la interfaz (HTML en este caso)

• Controlador para hacer calculos y unir todas las piezas

• De invencion bastante reciente (1979)

• Muy popular actualmente para plataformas de desarrollo web

Page 35: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Modelo

• Para acceder a los datos (BBDDs)

• Modulo: ActiveRecord

• Una clase representa una tabla

• Se descubren automaticamente los campos...

• ...y la tabla (Alumno → alumnos)

• Se pueden declarar relaciones con otrosmodelos/tablas

• Se puede personalizar y anadir metodos

Page 36: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Modelo

• Para acceder a los datos (BBDDs)

• Modulo: ActiveRecord

• Una clase representa una tabla

• Se descubren automaticamente los campos...

• ...y la tabla (Alumno → alumnos)

• Se pueden declarar relaciones con otrosmodelos/tablas

• Se puede personalizar y anadir metodos

Page 37: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Modelo

• Para acceder a los datos (BBDDs)

• Modulo: ActiveRecord

• Una clase representa una tabla

• Se descubren automaticamente los campos...

• ...y la tabla (Alumno → alumnos)

• Se pueden declarar relaciones con otrosmodelos/tablas

• Se puede personalizar y anadir metodos

Page 38: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Modelo

• Para acceder a los datos (BBDDs)

• Modulo: ActiveRecord

• Una clase representa una tabla

• Se descubren automaticamente los campos...

• ...y la tabla (Alumno → alumnos)

• Se pueden declarar relaciones con otrosmodelos/tablas

• Se puede personalizar y anadir metodos

Page 39: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Modelo

• Para acceder a los datos (BBDDs)

• Modulo: ActiveRecord

• Una clase representa una tabla

• Se descubren automaticamente los campos...

• ...y la tabla (Alumno → alumnos)

• Se pueden declarar relaciones con otrosmodelos/tablas

• Se puede personalizar y anadir metodos

Page 40: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Modelo

• Para acceder a los datos (BBDDs)

• Modulo: ActiveRecord

• Una clase representa una tabla

• Se descubren automaticamente los campos...

• ...y la tabla (Alumno → alumnos)

• Se pueden declarar relaciones con otrosmodelos/tablas

• Se puede personalizar y anadir metodos

Page 41: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Modelo

• Para acceder a los datos (BBDDs)

• Modulo: ActiveRecord

• Una clase representa una tabla

• Se descubren automaticamente los campos...

• ...y la tabla (Alumno → alumnos)

• Se pueden declarar relaciones con otrosmodelos/tablas

• Se puede personalizar y anadir metodos

Page 42: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo

class Alumno < ActiveRecord::Basehas_many :cursosdef socio?

not num_socio.nil?end

end

Page 43: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo

class Alumno < ActiveRecord::Basehas_many :cursosdef socio?

not num_socio.nil?end

end

Definicion base

Page 44: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo

class Alumno < ActiveRecord::Basehas_many :cursosdef socio?

not num_socio.nil?end

end

Declaracion de relacion

Page 45: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo

class Alumno < ActiveRecord::Basehas_many :cursosdef socio?

not num_socio.nil?end

end

Nuevo metodo

Page 46: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Vista

• Para decidir el aspecto

• Modulo: ActionView

• Plantillas en formato Embedded Ruby

• HTML con Ruby embebido

• Una por cada accion de cada controlador

• Corolario: dependen de los controladores

• HTML repetitivo, a funciones externas(helpers)

Page 47: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Vista

• Para decidir el aspecto

• Modulo: ActionView

• Plantillas en formato Embedded Ruby

• HTML con Ruby embebido

• Una por cada accion de cada controlador

• Corolario: dependen de los controladores

• HTML repetitivo, a funciones externas(helpers)

Page 48: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Vista

• Para decidir el aspecto

• Modulo: ActionView

• Plantillas en formato Embedded Ruby

• HTML con Ruby embebido

• Una por cada accion de cada controlador

• Corolario: dependen de los controladores

• HTML repetitivo, a funciones externas(helpers)

Page 49: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Vista

• Para decidir el aspecto

• Modulo: ActionView

• Plantillas en formato Embedded Ruby

• HTML con Ruby embebido

• Una por cada accion de cada controlador

• Corolario: dependen de los controladores

• HTML repetitivo, a funciones externas(helpers)

Page 50: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Vista

• Para decidir el aspecto

• Modulo: ActionView

• Plantillas en formato Embedded Ruby

• HTML con Ruby embebido

• Una por cada accion de cada controlador

• Corolario: dependen de los controladores

• HTML repetitivo, a funciones externas(helpers)

Page 51: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Vista

• Para decidir el aspecto

• Modulo: ActionView

• Plantillas en formato Embedded Ruby

• HTML con Ruby embebido

• Una por cada accion de cada controlador

• Corolario: dependen de los controladores

• HTML repetitivo, a funciones externas(helpers)

Page 52: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Vista

• Para decidir el aspecto

• Modulo: ActionView

• Plantillas en formato Embedded Ruby

• HTML con Ruby embebido

• Una por cada accion de cada controlador

• Corolario: dependen de los controladores

• HTML repetitivo, a funciones externas(helpers)

Page 53: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de vista

<h1>A~nadir alumno del curso < %= @curso.titulo %></h1>< % Alumno.find_all(nil, ’nombre’).each do |a| %>< %= radio_button(’alumno’, ’elegido’, a.id) %>

< % end %>

Page 54: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de vista

<h1>A~nadir alumno del curso < %= @curso.titulo %></h1>< % Alumno.find_all(nil, ’nombre’).each do |a| %>< %= radio_button(’alumno’, ’elegido’, a.id) %>

< % end %>

Imprimir el resultado de la expresion

Page 55: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de vista

<h1>A~nadir alumno del curso < %= @curso.titulo %></h1>< % Alumno.find_all(nil, ’nombre’).each do |a| %>< %= radio_button(’alumno’, ’elegido’, a.id) %>

< % end %>

Ejecutar codigo Ruby, sin imprimir

Page 56: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de vista

<h1>A~nadir alumno del curso < %= @curso.titulo %></h1>< % Alumno.find_all(nil, ’nombre’).each do |a| %>< %= radio_button(’alumno’, ’elegido’, a.id) %>

< % end %>

Helpers

Page 57: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Controlador

• ((Bisagra)) del MVC y logica de calculos

• Modulo: ActionPack

• Cada controlador, una clase de Ruby

• Cada metodo, una accion

• ((Andamios)) (scaffold) para avanzar mas rapido

Page 58: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Controlador

• ((Bisagra)) del MVC y logica de calculos

• Modulo: ActionPack

• Cada controlador, una clase de Ruby

• Cada metodo, una accion

• ((Andamios)) (scaffold) para avanzar mas rapido

Page 59: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Controlador

• ((Bisagra)) del MVC y logica de calculos

• Modulo: ActionPack

• Cada controlador, una clase de Ruby

• Cada metodo, una accion

• ((Andamios)) (scaffold) para avanzar mas rapido

Page 60: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Controlador

• ((Bisagra)) del MVC y logica de calculos

• Modulo: ActionPack

• Cada controlador, una clase de Ruby

• Cada metodo, una accion

• ((Andamios)) (scaffold) para avanzar mas rapido

Page 61: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Controlador

• ((Bisagra)) del MVC y logica de calculos

• Modulo: ActionPack

• Cada controlador, una clase de Ruby

• Cada metodo, una accion

• ((Andamios)) (scaffold) para avanzar mas rapido

Page 62: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class CursoController < ApplicationControllerlayout ’base’def nueva_accion@curso = Curso.find(params[:id])

endend

Page 63: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class CursoController < ApplicationControllerlayout ’base’def nueva_accion@curso = Curso.find(params[:id])

endend

Definicion base

Page 64: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class CursoController < ApplicationControllerlayout ’base’def nueva_accion@curso = Curso.find(params[:id])

endend

Declarar una plantilla ((general)) alternativa

Page 65: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class CursoController < ApplicationControllerlayout ’base’def nueva_accion@curso = Curso.find(params[:id])

endend

Nueva accion

Page 66: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class CursoController < ApplicationControllerlayout ’base’def nueva_accion@curso = Curso.find(params[:id])

endend

Variables de objeto (se veran en la plantilla)

Page 67: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class CursoController < ApplicationControllerlayout ’base’def nueva_accion@curso = Curso.find(params[:id])

endend

Uso de modelos

Page 68: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class CursoController < ApplicationControllerlayout ’base’def nueva_accion@curso = Curso.find(params[:id])

endend

Acceso a parametros

Page 69: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Indice

1 IntroduccionLa revolucion del desarrollo webMVCOtras comodidades

2 Cada componente en detalleActiveRecordActionPackEnlaces

Page 70: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Utilidades

• Para empezar, rails

• Y las de ./script/foo :

• generate (genera codigo)• server (servidor simple para desarrollo)• console (consola interactiva)• runner (ejecuta trozos de Ruby)• breakpointer (engancha con puntos de ruptura)

Page 71: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Utilidades

• Para empezar, rails

• Y las de ./script/foo :

• generate (genera codigo)• server (servidor simple para desarrollo)• console (consola interactiva)• runner (ejecuta trozos de Ruby)• breakpointer (engancha con puntos de ruptura)

Page 72: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Utilidades

• Para empezar, rails

• Y las de ./script/foo :• generate (genera codigo)

• server (servidor simple para desarrollo)• console (consola interactiva)• runner (ejecuta trozos de Ruby)• breakpointer (engancha con puntos de ruptura)

Page 73: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Utilidades

• Para empezar, rails

• Y las de ./script/foo :• generate (genera codigo)• server (servidor simple para desarrollo)

• console (consola interactiva)• runner (ejecuta trozos de Ruby)• breakpointer (engancha con puntos de ruptura)

Page 74: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Utilidades

• Para empezar, rails

• Y las de ./script/foo :• generate (genera codigo)• server (servidor simple para desarrollo)• console (consola interactiva)

• runner (ejecuta trozos de Ruby)• breakpointer (engancha con puntos de ruptura)

Page 75: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Utilidades

• Para empezar, rails

• Y las de ./script/foo :• generate (genera codigo)• server (servidor simple para desarrollo)• console (consola interactiva)• runner (ejecuta trozos de Ruby)

• breakpointer (engancha con puntos de ruptura)

Page 76: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Utilidades

• Para empezar, rails

• Y las de ./script/foo :• generate (genera codigo)• server (servidor simple para desarrollo)• console (consola interactiva)• runner (ejecuta trozos de Ruby)• breakpointer (engancha con puntos de ruptura)

Page 77: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Rakefile

• Una especie de Makefile...

• ...pero escrito en Ruby

• Viene un Rakefile de serie, con varios objetivos:

• stats• doc• test• test recent• migrate

Page 78: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Rakefile

• Una especie de Makefile...

• ...pero escrito en Ruby

• Viene un Rakefile de serie, con varios objetivos:

• stats• doc• test• test recent• migrate

Page 79: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Rakefile

• Una especie de Makefile...

• ...pero escrito en Ruby

• Viene un Rakefile de serie, con varios objetivos:

• stats• doc• test• test recent• migrate

Page 80: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Rakefile

• Una especie de Makefile...

• ...pero escrito en Ruby

• Viene un Rakefile de serie, con varios objetivos:• stats

• doc• test• test recent• migrate

Page 81: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Rakefile

• Una especie de Makefile...

• ...pero escrito en Ruby

• Viene un Rakefile de serie, con varios objetivos:• stats• doc

• test• test recent• migrate

Page 82: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Rakefile

• Una especie de Makefile...

• ...pero escrito en Ruby

• Viene un Rakefile de serie, con varios objetivos:• stats• doc• test

• test recent• migrate

Page 83: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Rakefile

• Una especie de Makefile...

• ...pero escrito en Ruby

• Viene un Rakefile de serie, con varios objetivos:• stats• doc• test• test recent

• migrate

Page 84: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Rakefile

• Una especie de Makefile...

• ...pero escrito en Ruby

• Viene un Rakefile de serie, con varios objetivos:• stats• doc• test• test recent• migrate

Page 85: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Indice

1 IntroduccionLa revolucion del desarrollo webMVCOtras comodidades

2 Cada componente en detalleActiveRecordActionPackEnlaces

Page 86: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActiveRecord

• Capa de acceso a bases de datos SQL

• Abstrae los accesos a cada tabla

• Cada registro de cada tabla es un objeto

• Los campos son los metodos

• ¡Atras, SQL, yo te lo mando, callate y obedece!

• Convencion de nombres: Cosa para la tabla cosas

• Sı, puedes usar bases de datos existentes (set table name)

• Tambien problemas con ((no ingles)), pero varias soluciones

• Nuevo modelo → ./script/generate model Tabla

Page 87: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActiveRecord

• Capa de acceso a bases de datos SQL

• Abstrae los accesos a cada tabla

• Cada registro de cada tabla es un objeto

• Los campos son los metodos

• ¡Atras, SQL, yo te lo mando, callate y obedece!

• Convencion de nombres: Cosa para la tabla cosas

• Sı, puedes usar bases de datos existentes (set table name)

• Tambien problemas con ((no ingles)), pero varias soluciones

• Nuevo modelo → ./script/generate model Tabla

Page 88: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActiveRecord

• Capa de acceso a bases de datos SQL

• Abstrae los accesos a cada tabla

• Cada registro de cada tabla es un objeto

• Los campos son los metodos

• ¡Atras, SQL, yo te lo mando, callate y obedece!

• Convencion de nombres: Cosa para la tabla cosas

• Sı, puedes usar bases de datos existentes (set table name)

• Tambien problemas con ((no ingles)), pero varias soluciones

• Nuevo modelo → ./script/generate model Tabla

Page 89: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActiveRecord

• Capa de acceso a bases de datos SQL

• Abstrae los accesos a cada tabla

• Cada registro de cada tabla es un objeto

• Los campos son los metodos

• ¡Atras, SQL, yo te lo mando, callate y obedece!

• Convencion de nombres: Cosa para la tabla cosas

• Sı, puedes usar bases de datos existentes (set table name)

• Tambien problemas con ((no ingles)), pero varias soluciones

• Nuevo modelo → ./script/generate model Tabla

Page 90: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActiveRecord

• Capa de acceso a bases de datos SQL

• Abstrae los accesos a cada tabla

• Cada registro de cada tabla es un objeto

• Los campos son los metodos

• ¡Atras, SQL, yo te lo mando, callate y obedece!

• Convencion de nombres: Cosa para la tabla cosas

• Sı, puedes usar bases de datos existentes (set table name)

• Tambien problemas con ((no ingles)), pero varias soluciones

• Nuevo modelo → ./script/generate model Tabla

Page 91: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActiveRecord

• Capa de acceso a bases de datos SQL

• Abstrae los accesos a cada tabla

• Cada registro de cada tabla es un objeto

• Los campos son los metodos

• ¡Atras, SQL, yo te lo mando, callate y obedece!

• Convencion de nombres: Cosa para la tabla cosas

• Sı, puedes usar bases de datos existentes (set table name)

• Tambien problemas con ((no ingles)), pero varias soluciones

• Nuevo modelo → ./script/generate model Tabla

Page 92: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActiveRecord

• Capa de acceso a bases de datos SQL

• Abstrae los accesos a cada tabla

• Cada registro de cada tabla es un objeto

• Los campos son los metodos

• ¡Atras, SQL, yo te lo mando, callate y obedece!

• Convencion de nombres: Cosa para la tabla cosas

• Sı, puedes usar bases de datos existentes (set table name)

• Tambien problemas con ((no ingles)), pero varias soluciones

• Nuevo modelo → ./script/generate model Tabla

Page 93: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActiveRecord

• Capa de acceso a bases de datos SQL

• Abstrae los accesos a cada tabla

• Cada registro de cada tabla es un objeto

• Los campos son los metodos

• ¡Atras, SQL, yo te lo mando, callate y obedece!

• Convencion de nombres: Cosa para la tabla cosas

• Sı, puedes usar bases de datos existentes (set table name)

• Tambien problemas con ((no ingles)), pero varias soluciones

• Nuevo modelo → ./script/generate model Tabla

Page 94: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActiveRecord

• Capa de acceso a bases de datos SQL

• Abstrae los accesos a cada tabla

• Cada registro de cada tabla es un objeto

• Los campos son los metodos

• ¡Atras, SQL, yo te lo mando, callate y obedece!

• Convencion de nombres: Cosa para la tabla cosas

• Sı, puedes usar bases de datos existentes (set table name)

• Tambien problemas con ((no ingles)), pero varias soluciones

• Nuevo modelo → ./script/generate model Tabla

Page 95: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones y mas

• Casi lo mas importante de ActiveRecord

• Acceder facilmente a modelos relacionados

• Se declaran con ((macros))

• has many, belongs to, has and belongs to, etc.

• Convenciones para reducir al mınimo el codigo

• Montones de caracterısticas interesantes (¡pero no haytiempo!)

• Validadores, migraciones, observadores

Page 96: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones y mas

• Casi lo mas importante de ActiveRecord

• Acceder facilmente a modelos relacionados

• Se declaran con ((macros))

• has many, belongs to, has and belongs to, etc.

• Convenciones para reducir al mınimo el codigo

• Montones de caracterısticas interesantes (¡pero no haytiempo!)

• Validadores, migraciones, observadores

Page 97: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones y mas

• Casi lo mas importante de ActiveRecord

• Acceder facilmente a modelos relacionados

• Se declaran con ((macros))

• has many, belongs to, has and belongs to, etc.

• Convenciones para reducir al mınimo el codigo

• Montones de caracterısticas interesantes (¡pero no haytiempo!)

• Validadores, migraciones, observadores

Page 98: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones y mas

• Casi lo mas importante de ActiveRecord

• Acceder facilmente a modelos relacionados

• Se declaran con ((macros))

• has many, belongs to, has and belongs to, etc.

• Convenciones para reducir al mınimo el codigo

• Montones de caracterısticas interesantes (¡pero no haytiempo!)

• Validadores, migraciones, observadores

Page 99: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones y mas

• Casi lo mas importante de ActiveRecord

• Acceder facilmente a modelos relacionados

• Se declaran con ((macros))

• has many, belongs to, has and belongs to, etc.

• Convenciones para reducir al mınimo el codigo

• Montones de caracterısticas interesantes (¡pero no haytiempo!)

• Validadores, migraciones, observadores

Page 100: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones y mas

• Casi lo mas importante de ActiveRecord

• Acceder facilmente a modelos relacionados

• Se declaran con ((macros))

• has many, belongs to, has and belongs to, etc.

• Convenciones para reducir al mınimo el codigo

• Montones de caracterısticas interesantes (¡pero no haytiempo!)

• Validadores, migraciones, observadores

Page 101: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones y mas

• Casi lo mas importante de ActiveRecord

• Acceder facilmente a modelos relacionados

• Se declaran con ((macros))

• has many, belongs to, has and belongs to, etc.

• Convenciones para reducir al mınimo el codigo

• Montones de caracterısticas interesantes (¡pero no haytiempo!)

• Validadores, migraciones, observadores

Page 102: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones: ejemplos varios

class Curso < ActiveRecord::Basehas_many :documentoshas_many :examenes, :class_name => ’Documento’,

:conditions => "tipo = ’examen’"has_and_belongs_to_many :alumnos, :order => ’nombre’belongs_to :temporada, :class_name => ’AnoAcademico’,

:foreign_key => ’curso_id’end

Page 103: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones: ejemplos varios

class Curso < ActiveRecord::Basehas_many :documentoshas_many :examenes, :class_name => ’Documento’,

:conditions => "tipo = ’examen’"has_and_belongs_to_many :alumnos, :order => ’nombre’belongs_to :temporada, :class_name => ’AnoAcademico’,

:foreign_key => ’curso_id’end

Page 104: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones: ejemplos varios

class Curso < ActiveRecord::Basehas_many :documentoshas_many :examenes, :class_name => ’Documento’,

:conditions => "tipo = ’examen’"has_and_belongs_to_many :alumnos, :order => ’nombre’belongs_to :temporada, :class_name => ’AnoAcademico’,

:foreign_key => ’curso_id’end

Page 105: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones: ejemplos varios

class Curso < ActiveRecord::Basehas_many :documentoshas_many :examenes, :class_name => ’Documento’,

:conditions => "tipo = ’examen’"has_and_belongs_to_many :alumnos, :order => ’nombre’belongs_to :temporada, :class_name => ’AnoAcademico’,

:foreign_key => ’curso_id’end

Page 106: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Relaciones: ejemplos varios

class Curso < ActiveRecord::Basehas_many :documentoshas_many :examenes, :class_name => ’Documento’,

:conditions => "tipo = ’examen’"has_and_belongs_to_many :alumnos, :order => ’nombre’belongs_to :temporada, :class_name => ’AnoAcademico’,

:foreign_key => ’curso_id’end

Page 107: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo (I)

class Cita < ActiveRecord::Basebelongs_to :autor # autor_idhas_many :comentariosdef puntuacionif comentarios.empty?return 0

elsemedia = 0comentarios.each do |com|media += com.puntuacion

endreturn media / comentarios.size

endend

end

Page 108: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo (I)

class Cita < ActiveRecord::Basebelongs_to :autor # autor_idhas_many :comentariosdef puntuacionif comentarios.empty?return 0

elsemedia = 0comentarios.each do |com|media += com.puntuacion

endreturn media / comentarios.size

endend

end

Page 109: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo (I)

class Cita < ActiveRecord::Basebelongs_to :autor # autor_idhas_many :comentariosdef puntuacionif comentarios.empty?return 0

elsemedia = 0comentarios.each do |com|media += com.puntuacion

endreturn media / comentarios.size

endend

end

Page 110: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo (I)

class Cita < ActiveRecord::Basebelongs_to :autor # autor_idhas_many :comentariosdef puntuacionif comentarios.empty?return 0

elsemedia = 0comentarios.each do |com|media += com.puntuacion

endreturn media / comentarios.size

endend

end

Page 111: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo (I)

class Cita < ActiveRecord::Basebelongs_to :autor # autor_idhas_many :comentariosdef puntuacionif comentarios.empty?return 0

elsemedia = 0comentarios.each do |com|media += com.puntuacion

endreturn media / comentarios.size

endend

end

Page 112: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo (I)

class Cita < ActiveRecord::Basebelongs_to :autor # autor_idhas_many :comentariosdef puntuacionif comentarios.empty?return 0

elsemedia = 0comentarios.each do |com|media += com.puntuacion

endreturn media / comentarios.size

endend

end

Page 113: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo (II)

class Autor < ActiveRecord::Baseset_table_name ’autores’has_many :citas

end

Page 114: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo (II)

class Autor < ActiveRecord::Baseset_table_name ’autores’has_many :citas

end

Page 115: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de modelo (II)

class Autor < ActiveRecord::Baseset_table_name ’autores’has_many :citas

end

Page 116: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Miniejercicio

• Crear una base de datos (citas)

• Cargar la definicion de tablas (citas.sql)

• Crear una nueva aplicacion Railsrails citas

• Configurar la base de datosscite config\database.yml

• Crear los modelos y personalizarlosruby script\generate model Autorruby script\generate model Citascite app\models\autor.rb...

• Abrir una consola y crear un par de citasruby script\console

Page 117: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Miniejercicio

• Crear una base de datos (citas)

• Cargar la definicion de tablas (citas.sql)

• Crear una nueva aplicacion Railsrails citas

• Configurar la base de datosscite config\database.yml

• Crear los modelos y personalizarlosruby script\generate model Autorruby script\generate model Citascite app\models\autor.rb...

• Abrir una consola y crear un par de citasruby script\console

Page 118: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo

>> autor = Autor.create(:nombre => ’Fernado Arrabal’)=> #<Autor:0xb74604a8 @new_record=false, ...>>> cita = Cita.create(:texto => "Hablamos del \

mineralismo, ¡cojones ya!", :autor_id => autor)=> #<Cita:0xb744e320 @new_record=false, ...>>> autor.citas << Cita.create(:texto => "¡Dejame \

hablar!")=> [#<Cita:0xb7442354 @attributes={"autor_id"=>"1", ...>]>> autor.citas.size=> 2>> Autor.find(1)=> #<Autor:0xb74490c4 @attributes={"nombre"...>>> Autor.find(2)ActiveRecord::RecordNotFound: Couldn’t find Autor with ID=2...

Page 119: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo

>> autor = Autor.create(:nombre => ’Fernado Arrabal’)=> #<Autor:0xb74604a8 @new_record=false, ...>>> cita = Cita.create(:texto => "Hablamos del \

mineralismo, ¡cojones ya!", :autor_id => autor)=> #<Cita:0xb744e320 @new_record=false, ...>>> autor.citas << Cita.create(:texto => "¡Dejame \

hablar!")=> [#<Cita:0xb7442354 @attributes={"autor_id"=>"1", ...>]>> autor.citas.size=> 2>> Autor.find(1)=> #<Autor:0xb74490c4 @attributes={"nombre"...>>> Autor.find(2)ActiveRecord::RecordNotFound: Couldn’t find Autor with ID=2...

Page 120: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo

>> autor = Autor.create(:nombre => ’Fernado Arrabal’)=> #<Autor:0xb74604a8 @new_record=false, ...>>> cita = Cita.create(:texto => "Hablamos del \

mineralismo, ¡cojones ya!", :autor_id => autor)=> #<Cita:0xb744e320 @new_record=false, ...>>> autor.citas << Cita.create(:texto => "¡Dejame \

hablar!")=> [#<Cita:0xb7442354 @attributes={"autor_id"=>"1", ...>]>> autor.citas.size=> 2>> Autor.find(1)=> #<Autor:0xb74490c4 @attributes={"nombre"...>>> Autor.find(2)ActiveRecord::RecordNotFound: Couldn’t find Autor with ID=2...

Page 121: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo

>> autor = Autor.create(:nombre => ’Fernado Arrabal’)=> #<Autor:0xb74604a8 @new_record=false, ...>>> cita = Cita.create(:texto => "Hablamos del \

mineralismo, ¡cojones ya!", :autor_id => autor)=> #<Cita:0xb744e320 @new_record=false, ...>>> autor.citas << Cita.create(:texto => "¡Dejame \

hablar!")=> [#<Cita:0xb7442354 @attributes={"autor_id"=>"1", ...>]>> autor.citas.size=> 2>> Autor.find(1)=> #<Autor:0xb74490c4 @attributes={"nombre"...>>> Autor.find(2)ActiveRecord::RecordNotFound: Couldn’t find Autor with ID=2...

Page 122: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo

>> autor = Autor.create(:nombre => ’Fernado Arrabal’)=> #<Autor:0xb74604a8 @new_record=false, ...>>> cita = Cita.create(:texto => "Hablamos del \

mineralismo, ¡cojones ya!", :autor_id => autor)=> #<Cita:0xb744e320 @new_record=false, ...>>> autor.citas << Cita.create(:texto => "¡Dejame \

hablar!")=> [#<Cita:0xb7442354 @attributes={"autor_id"=>"1", ...>]>> autor.citas.size=> 2>> Autor.find(1)=> #<Autor:0xb74490c4 @attributes={"nombre"...>>> Autor.find(2)ActiveRecord::RecordNotFound: Couldn’t find Autor with ID=2...

Page 123: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo

>> autor = Autor.create(:nombre => ’Fernado Arrabal’)=> #<Autor:0xb74604a8 @new_record=false, ...>>> cita = Cita.create(:texto => "Hablamos del \

mineralismo, ¡cojones ya!", :autor_id => autor)=> #<Cita:0xb744e320 @new_record=false, ...>>> autor.citas << Cita.create(:texto => "¡Dejame \

hablar!")=> [#<Cita:0xb7442354 @attributes={"autor_id"=>"1", ...>]>> autor.citas.size=> 2>> Autor.find(1)=> #<Autor:0xb74490c4 @attributes={"nombre"...>>> Autor.find(2)ActiveRecord::RecordNotFound: Couldn’t find Autor with ID=2...

Page 124: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo

>> autor = Autor.create(:nombre => ’Fernado Arrabal’)=> #<Autor:0xb74604a8 @new_record=false, ...>>> cita = Cita.create(:texto => "Hablamos del \

mineralismo, ¡cojones ya!", :autor_id => autor)=> #<Cita:0xb744e320 @new_record=false, ...>>> autor.citas << Cita.create(:texto => "¡Dejame \

hablar!")=> [#<Cita:0xb7442354 @attributes={"autor_id"=>"1", ...>]>> autor.citas.size=> 2>> Autor.find(1)=> #<Autor:0xb74490c4 @attributes={"nombre"...>>> Autor.find(2)ActiveRecord::RecordNotFound: Couldn’t find Autor with ID=2...

Page 125: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo

>> autor = Autor.create(:nombre => ’Fernado Arrabal’)=> #<Autor:0xb74604a8 @new_record=false, ...>>> cita = Cita.create(:texto => "Hablamos del \

mineralismo, ¡cojones ya!", :autor_id => autor)=> #<Cita:0xb744e320 @new_record=false, ...>>> autor.citas << Cita.create(:texto => "¡Dejame \

hablar!")=> [#<Cita:0xb7442354 @attributes={"autor_id"=>"1", ...>]>> autor.citas.size=> 2>> Autor.find(1)=> #<Autor:0xb74490c4 @attributes={"nombre"...>>> Autor.find(2)ActiveRecord::RecordNotFound: Couldn’t find Autor with ID=2...

Page 126: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo

>> autor = Autor.create(:nombre => ’Fernado Arrabal’)=> #<Autor:0xb74604a8 @new_record=false, ...>>> cita = Cita.create(:texto => "Hablamos del \

mineralismo, ¡cojones ya!", :autor_id => autor)=> #<Cita:0xb744e320 @new_record=false, ...>>> autor.citas << Cita.create(:texto => "¡Dejame \

hablar!")=> [#<Cita:0xb7442354 @attributes={"autor_id"=>"1", ...>]>> autor.citas.size=> 2>> Autor.find(1)=> #<Autor:0xb74490c4 @attributes={"nombre"...>>> Autor.find(2)ActiveRecord::RecordNotFound: Couldn’t find Autor with ID=2...

Page 127: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo

>> autor = Autor.create(:nombre => ’Fernado Arrabal’)=> #<Autor:0xb74604a8 @new_record=false, ...>>> cita = Cita.create(:texto => "Hablamos del \

mineralismo, ¡cojones ya!", :autor_id => autor)=> #<Cita:0xb744e320 @new_record=false, ...>>> autor.citas << Cita.create(:texto => "¡Dejame \

hablar!")=> [#<Cita:0xb7442354 @attributes={"autor_id"=>"1", ...>]>> autor.citas.size=> 2>> Autor.find(1)=> #<Autor:0xb74490c4 @attributes={"nombre"...>>> Autor.find(2)ActiveRecord::RecordNotFound: Couldn’t find Autor with ID=2...

Page 128: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo

>> autor = Autor.create(:nombre => ’Fernado Arrabal’)=> #<Autor:0xb74604a8 @new_record=false, ...>>> cita = Cita.create(:texto => "Hablamos del \

mineralismo, ¡cojones ya!", :autor_id => autor)=> #<Cita:0xb744e320 @new_record=false, ...>>> autor.citas << Cita.create(:texto => "¡Dejame \

hablar!")=> [#<Cita:0xb7442354 @attributes={"autor_id"=>"1", ...>]>> autor.citas.size=> 2>> Autor.find(1)=> #<Autor:0xb74490c4 @attributes={"nombre"...>>> Autor.find(2)ActiveRecord::RecordNotFound: Couldn’t find Autor with ID=2...

Page 129: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 130: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 131: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 132: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 133: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 134: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 135: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 136: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 137: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 138: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 139: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 140: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de uso interactivo (II)

>> citas = Cita.find(:all, :conditions =>["texto LIKE :buscar",

{:buscar => ’ %jones %’}])=> [#<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>]>> Cita.find(:first, :conditions =>

["texto LIKE :buscar",{:buscar => ’ %jones %’}])

=> #<Cita:0xb74aba48 @attributes={"autor_id"=>"1",...>>> citas.size=> 1>> fer = citas[0].autor=> #<Autor:0xb74a6ee4 @attributes={"nombre"=>...}>>> fer.nombre = "Fernando Arrabal POWA"=> "Fernado Arrabal POWA">> fer.save=> true

Page 141: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Indice

1 IntroduccionLa revolucion del desarrollo webMVCOtras comodidades

2 Cada componente en detalleActiveRecordActionPackEnlaces

Page 142: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActionPack

• Bisagra de todo el cotarro

• Recibe las peticiones y las ejecuta

• Cada controlador es una clase Ruby

• Cada accion es un metodo del controlador

• Las direcciones son del estilo URL/controlador/accion/id

• Realmente se pueden cambiar (rutas)

• Nuevo controlador → ./script/generate controller Foo

Page 143: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActionPack

• Bisagra de todo el cotarro

• Recibe las peticiones y las ejecuta

• Cada controlador es una clase Ruby

• Cada accion es un metodo del controlador

• Las direcciones son del estilo URL/controlador/accion/id

• Realmente se pueden cambiar (rutas)

• Nuevo controlador → ./script/generate controller Foo

Page 144: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActionPack

• Bisagra de todo el cotarro

• Recibe las peticiones y las ejecuta

• Cada controlador es una clase Ruby

• Cada accion es un metodo del controlador

• Las direcciones son del estilo URL/controlador/accion/id

• Realmente se pueden cambiar (rutas)

• Nuevo controlador → ./script/generate controller Foo

Page 145: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActionPack

• Bisagra de todo el cotarro

• Recibe las peticiones y las ejecuta

• Cada controlador es una clase Ruby

• Cada accion es un metodo del controlador

• Las direcciones son del estilo URL/controlador/accion/id

• Realmente se pueden cambiar (rutas)

• Nuevo controlador → ./script/generate controller Foo

Page 146: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActionPack

• Bisagra de todo el cotarro

• Recibe las peticiones y las ejecuta

• Cada controlador es una clase Ruby

• Cada accion es un metodo del controlador

• Las direcciones son del estilo URL/controlador/accion/id

• Realmente se pueden cambiar (rutas)

• Nuevo controlador → ./script/generate controller Foo

Page 147: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActionPack

• Bisagra de todo el cotarro

• Recibe las peticiones y las ejecuta

• Cada controlador es una clase Ruby

• Cada accion es un metodo del controlador

• Las direcciones son del estilo URL/controlador/accion/id

• Realmente se pueden cambiar (rutas)

• Nuevo controlador → ./script/generate controller Foo

Page 148: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

ActionPack

• Bisagra de todo el cotarro

• Recibe las peticiones y las ejecuta

• Cada controlador es una clase Ruby

• Cada accion es un metodo del controlador

• Las direcciones son del estilo URL/controlador/accion/id

• Realmente se pueden cambiar (rutas)

• Nuevo controlador → ./script/generate controller Foo

Page 149: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class PruebasController < ApplicationControllerdef accion

render(:text => "Escribo algo sin plantillas")end

def plantilla@citas = Cita.find(:all, :order => ’autor_id’)

end

def calculin# Hacemos algun calculoredirect_to(:action => ’plantilla’)

endend

Page 150: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class PruebasController < ApplicationControllerdef accion

render(:text => "Escribo algo sin plantillas")end

def plantilla@citas = Cita.find(:all, :order => ’autor_id’)

end

def calculin# Hacemos algun calculoredirect_to(:action => ’plantilla’)

endend

Page 151: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class PruebasController < ApplicationControllerdef accion

render(:text => "Escribo algo sin plantillas")end

def plantilla@citas = Cita.find(:all, :order => ’autor_id’)

end

def calculin# Hacemos algun calculoredirect_to(:action => ’plantilla’)

endend

Page 152: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class PruebasController < ApplicationControllerdef accion

render(:text => "Escribo algo sin plantillas")end

def plantilla@citas = Cita.find(:all, :order => ’autor_id’)

end

def calculin# Hacemos algun calculoredirect_to(:action => ’plantilla’)

endend

Page 153: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class PruebasController < ApplicationControllerdef accion

render(:text => "Escribo algo sin plantillas")end

def plantilla@citas = Cita.find(:all, :order => ’autor_id’)

end

def calculin# Hacemos algun calculoredirect_to(:action => ’plantilla’)

endend

Page 154: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class PruebasController < ApplicationControllerdef accion

render(:text => "Escribo algo sin plantillas")end

def plantilla@citas = Cita.find(:all, :order => ’autor_id’)

end

def calculin# Hacemos algun calculoredirect_to(:action => ’plantilla’)

endend

Page 155: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class PruebasController < ApplicationControllerdef accion

render(:text => "Escribo algo sin plantillas")end

def plantilla@citas = Cita.find(:all, :order => ’autor_id’)

end

def calculin# Hacemos algun calculoredirect_to(:action => ’plantilla’)

endend

Page 156: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejemplo de controlador

class PruebasController < ApplicationControllerdef accion

render(:text => "Escribo algo sin plantillas")end

def plantilla@citas = Cita.find(:all, :order => ’autor_id’)

end

def calculin# Hacemos algun calculoredirect_to(:action => ’plantilla’)

endend

Page 157: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejercicio guiado

• Crear un controlador pruebaruby script\generate controllerprueba

• Arrancar el servidor WEBrickruby script\server

• Crear una accion de prueba, con y sinplantillascite app\controllers\prueba...

• Probar que funciona como se espera

• Mostrar las citas de la BDD

• Crear un andamio para las citasruby script\generate scaffoldCita

Page 158: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejercicio guiado

• Crear un controlador pruebaruby script\generate controllerprueba

• Arrancar el servidor WEBrickruby script\server

• Crear una accion de prueba, con y sinplantillascite app\controllers\prueba...

• Probar que funciona como se espera

• Mostrar las citas de la BDD

• Crear un andamio para las citasruby script\generate scaffoldCita

Page 159: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejercicio guiado

• Crear un controlador pruebaruby script\generate controllerprueba

• Arrancar el servidor WEBrickruby script\server

• Crear una accion de prueba, con y sinplantillascite app\controllers\prueba...

• Probar que funciona como se espera

• Mostrar las citas de la BDD

• Crear un andamio para las citasruby script\generate scaffoldCita

Page 160: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejercicio guiado

• Crear un controlador pruebaruby script\generate controllerprueba

• Arrancar el servidor WEBrickruby script\server

• Crear una accion de prueba, con y sinplantillascite app\controllers\prueba...

• Probar que funciona como se espera

• Mostrar las citas de la BDD

• Crear un andamio para las citasruby script\generate scaffoldCita

Page 161: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejercicio guiado

• Crear un controlador pruebaruby script\generate controllerprueba

• Arrancar el servidor WEBrickruby script\server

• Crear una accion de prueba, con y sinplantillascite app\controllers\prueba...

• Probar que funciona como se espera

• Mostrar las citas de la BDD

• Crear un andamio para las citasruby script\generate scaffoldCita

Page 162: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejercicio guiado

• Crear un controlador pruebaruby script\generate controllerprueba

• Arrancar el servidor WEBrickruby script\server

• Crear una accion de prueba, con y sinplantillascite app\controllers\prueba...

• Probar que funciona como se espera

• Mostrar las citas de la BDD

• Crear un andamio para las citasruby script\generate scaffoldCita

Page 163: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Un par de virguerıas mas

• Crear un andamio para los autoresruby script\generate scaffold Autor

• ¡Argh, no funciona!

• Arreglamos las citas anonimasscite app\views\citas...

• Anadimos citas por Ajax

• Anadimos algun truco mono en la vuelta del Ajax

Page 164: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Un par de virguerıas mas

• Crear un andamio para los autoresruby script\generate scaffold Autor

• ¡Argh, no funciona!

• Arreglamos las citas anonimasscite app\views\citas...

• Anadimos citas por Ajax

• Anadimos algun truco mono en la vuelta del Ajax

Page 165: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Un par de virguerıas mas

• Crear un andamio para los autoresruby script\generate scaffold Autor

• ¡Argh, no funciona! (Mi no hablo espanolo)scite config\environment.rb

• Arreglamos las citas anonimasscite app\views\citas...

• Anadimos citas por Ajax

• Anadimos algun truco mono en la vuelta del Ajax

Page 166: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Un par de virguerıas mas

• Crear un andamio para los autoresruby script\generate scaffold Autor

• ¡Argh, no funciona! (Mi no hablo espanolo)scite config\environment.rb

• Arreglamos las citas anonimasscite app\views\citas...

• Anadimos citas por Ajax

• Anadimos algun truco mono en la vuelta del Ajax

Page 167: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Un par de virguerıas mas

• Crear un andamio para los autoresruby script\generate scaffold Autor

• ¡Argh, no funciona! (Mi no hablo espanolo)scite config\environment.rb

• Arreglamos las citas anonimasscite app\views\citas...

• Anadimos citas por Ajax

• Anadimos algun truco mono en la vuelta del Ajax

Page 168: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Un par de virguerıas mas

• Crear un andamio para los autoresruby script\generate scaffold Autor

• ¡Argh, no funciona! (Mi no hablo espanolo)scite config\environment.rb

• Arreglamos las citas anonimasscite app\views\citas...

• Anadimos citas por Ajax

• Anadimos algun truco mono en la vuelta del Ajax

Page 169: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejercicio

• Poner una caja con autocompletado de autoreshttp://demo.script.aculo.us/ajax/autocompleter

• Con eso, implementar una busqueda de citas de ese autorhttp://localhost:3000/autores/citas de

Page 170: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Ejercicio

• Poner una caja con autocompletado de autoreshttp://demo.script.aculo.us/ajax/autocompleter

• Con eso, implementar una busqueda de citas de ese autorhttp://localhost:3000/autores/citas de

Page 171: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Mas cosas interesantes

• Plantillas generales, plantillas parciales

• send file, send data

• Filtros: before filter, after filter

• Entornos de programacion

• ActionMailer

• Rutas

• Extensiones al lenguaje Ruby

• Helpers de texto y otros

Page 172: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Mas cosas interesantes

• Plantillas generales, plantillas parciales

• send file, send data

• Filtros: before filter, after filter

• Entornos de programacion

• ActionMailer

• Rutas

• Extensiones al lenguaje Ruby

• Helpers de texto y otros

Page 173: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Mas cosas interesantes

• Plantillas generales, plantillas parciales

• send file, send data

• Filtros: before filter, after filter

• Entornos de programacion

• ActionMailer

• Rutas

• Extensiones al lenguaje Ruby

• Helpers de texto y otros

Page 174: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Mas cosas interesantes

• Plantillas generales, plantillas parciales

• send file, send data

• Filtros: before filter, after filter

• Entornos de programacion

• ActionMailer

• Rutas

• Extensiones al lenguaje Ruby

• Helpers de texto y otros

Page 175: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Mas cosas interesantes

• Plantillas generales, plantillas parciales

• send file, send data

• Filtros: before filter, after filter

• Entornos de programacion

• ActionMailer

• Rutas

• Extensiones al lenguaje Ruby

• Helpers de texto y otros

Page 176: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Mas cosas interesantes

• Plantillas generales, plantillas parciales

• send file, send data

• Filtros: before filter, after filter

• Entornos de programacion

• ActionMailer

• Rutas

• Extensiones al lenguaje Ruby

• Helpers de texto y otros

Page 177: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Mas cosas interesantes

• Plantillas generales, plantillas parciales

• send file, send data

• Filtros: before filter, after filter

• Entornos de programacion

• ActionMailer

• Rutas

• Extensiones al lenguaje Ruby

• Helpers de texto y otros

Page 178: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Mas cosas interesantes

• Plantillas generales, plantillas parciales

• send file, send data

• Filtros: before filter, after filter

• Entornos de programacion

• ActionMailer

• Rutas

• Extensiones al lenguaje Ruby

• Helpers de texto y otros

Page 179: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Indice

1 IntroduccionLa revolucion del desarrollo webMVCOtras comodidades

2 Cada componente en detalleActiveRecordActionPackEnlaces

Page 180: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

Enlaces

• http://www.ferorcarril.com

• http://the-cocktail.com/docs/rails1/

• http://the-cocktail.com/docs/rails2/

• http://www.ruby.org.es

• http://www.rubyonrails.com

• http://api.rubyonrails.com

• http://www.ruby-lang.org

• http://www.zingzang.org

Page 181: Esteban Manchado Vel´azquez zoso@fotonDesarrollo web tradicional • Separaci´on de conceptos • Duplicaci´on de codigo • Por separado, maduro , pero no muy bien integrado •

¡Manana mas!