75
Desarrollo Ágil con Ruby y Rails Fran Diéguez [email protected]

Desarrollo Agil con Ruby Y Rails

Embed Size (px)

DESCRIPTION

presentación de Ruby on Rails hecha en las II Conferencia sobre Programación Web de Ourense

Citation preview

Page 1: Desarrollo Agil con Ruby Y Rails

Desarrollo Ágil con Ruby y Rails

Fran Diéguez [email protected]

Page 2: Desarrollo Agil con Ruby Y Rails

Que vamos a ver

● Lenguaje Ruby

● Rails

● Puesta en producción

● Recursos

Grupo de usuarios de GNU/Linux da Galiza

Page 3: Desarrollo Agil con Ruby Y Rails

Lenguaje Ruby

Grupo de usuarios de GNU/Linux da Galiza

Page 4: Desarrollo Agil con Ruby Y Rails

Ruby::Instalación

Grupo de usuarios de GNU/Linux da Galiza

● Windows: instalación desde las fuentes (??) ● Mac OS: de serie en Leopard● GNU/Linux: sudo aptitude install ruby libzlib-ruby rdoc

irb rubygems ri

● Mi recomendación

● Siempre desde las fuentes

Page 5: Desarrollo Agil con Ruby Y Rails

Ruby::Puntos clave

Grupo de usuarios de GNU/Linux da Galiza

● Dinámico● Completo● Orientado a objetos

Page 6: Desarrollo Agil con Ruby Y Rails

Ruby::Filosofía

Fran Diéguez

● Diseñado para el programador frente a la máquina

Los idiomas infl uyen en la manera de pensar de las personas

Cercano a nuestra forma de pensar

Mejor Experiencia

Page 7: Desarrollo Agil con Ruby Y Rails

Ruby::Filosofía

Fran Diéguez

● "Principio de la menor sorpresa"

Hace lo que tiene que hacer como esperas

que lo haga

Page 8: Desarrollo Agil con Ruby Y Rails

Ruby::Ejemplos

Siempre se devuelve el último elemento evaluado

@usuario = if params[:id]

User.fi nd(:id)

else

User.new

end

Fran Diéguez

Page 9: Desarrollo Agil con Ruby Y Rails

Ruby::Ejemplos

Siempre se devuelve el último elemento evaluado

@usuario = if params[:id]

User.fi nd(:id)

else

User.new

end Menos Código

Fran Diéguez

Page 10: Desarrollo Agil con Ruby Y Rails

Ruby::Ejemplos

Asignaciones condicionales

@logeado = false unless defi ned?(@logueado)

@titulo = if defi ned?(@subseccion)

@subseccion.titulo

else

@seccion.titulo

=> @titulo = (@subseccion || @seccion).title

=> @logueado | |= false

Fran Diéguez

Page 11: Desarrollo Agil con Ruby Y Rails

Ruby::Ejemplos

La clase array y sus iteradores

@numeros = [1, 2, 3, 4, 5, 6]

@numeros.each do |elem|

puts elem

end

Frente al:

for elemento in @numeros

puts elemento

end

Fran Diéguez

Page 12: Desarrollo Agil con Ruby Y Rails

Ruby::Ejemplos

La clase Array y sus iteradores

.uniq

.fl atten

.compact

.reverse

.sort

.fi nd

.fi nd_all

@array = [1, 1, 2, 3, 4 , 4]

@array.uniq

=> [1, 2, 3, 4]

Fran Diéguez

Page 13: Desarrollo Agil con Ruby Y Rails

Ruby::Ejemplos

La clase Array y sus iteradores

.uniq

.fl atten

.compact

.reverse

.sort

.fi nd

.fi nd_all

@array = [ [1, 2, 3], [4, 5, 5] ]

@array.flatten

=> [1, 2, 3, 4, 5]

Fran Diéguez

Page 14: Desarrollo Agil con Ruby Y Rails

Ruby::Ejemplos

La clase Array y sus iteradores

.uniq

.fl atten

.compact

.reverse

.sort

.fi nd

.fi nd_all

@array = [ 1, 2, nil, nil, 3, 4] ]

@array.compact

=> [1, 2, 3, 4, 5]

Page 15: Desarrollo Agil con Ruby Y Rails

Ruby::Ejemplos

La clase Array y sus iteradores

.uniq

.fl atten

.compact

.reverse

.sort

.fi nd

.fi nd_all

@array = [1, 2, 3, 4, 5].reverse

@array = [3, 2, 5, 4, 1].sort

@array = [1, 2, 3, 4, 5].find_all do | e |

e % 2 == 0

end

=> [5, 4, 3 ,2 ,1]

=> [1, 2, 3, 4, 5]

=> [2, 4]

Page 16: Desarrollo Agil con Ruby Y Rails

Ruby::Array::Ejemplos

La clase Array y la potencia de los bloques

@precio_con_iva = @precios.map { | precio | precio * 0,16 }

@precios_con_iva = @precios.each do | precio |

@precios_con_iva << precio * 0.16

end

Estilo Ruby, Gran potencia, Menos código

Page 17: Desarrollo Agil con Ruby Y Rails

Ruby::Array::Ejemplos

La clase Array y la potencia de los bloques

@total_factura = @precios.inject { | total, precio | total += precio }

Estilo Ruby, Gran potencia, Menos código

@total_con_iva = 0

@precios.each do | precio |

@total += precio

end

Page 18: Desarrollo Agil con Ruby Y Rails

Ruby::Orientado a objetos

Todo es un objeto y no hay tipos primitivos

2 + 2 equivalente a 2+(2) y 2.send(:+, 2)

2.hours.ago

2.class # => Fixnum

2.class.methods - Object.methods

“ourense”.capitalize #=> “Ourense”

Fran Diéguez

Page 19: Desarrollo Agil con Ruby Y Rails

Ruby :: Orientado a objetos

Page 20: Desarrollo Agil con Ruby Y Rails

z

Ruby :: Orientado a objetos

Más Ruby Menos código

Page 21: Desarrollo Agil con Ruby Y Rails

RubyGems

Grupo de usuarios de GNU/Linux da Galiza

● Sistema empaquetado ofi cial de Ruby● Facilita la difusión de Software entre la comunidad● Formato estándar y autocontenido● Muy parecido a APT o PEAR (PHP).● Comandos de administración que simplifi can la

instalación y gestión de gemas● gem list● gem install <paquete>● gem source <repositorio>● gem unsoure <repositorio>

Page 22: Desarrollo Agil con Ruby Y Rails

Rails (por fin...)

Page 23: Desarrollo Agil con Ruby Y Rails

Rails::Here comes

Fran Diéguez

● Framework persistente de desarrollo web

● Incluye todo lo necesrio para crear aplicaciones web con fondo de base de datos según el patron Modelo-Vista-Controlador

– Separa la vista en plantillas basadas principalmente en tags HTML.

– El modelo contiene objetos de dominio “inteligentes” (como son Cuenta, Producto, Persona, Post) que mantiene toda la lógica de negocio y sabe como mantener la persistencia en la base de datos

– El controlador gestiona las peticiones entrantes (como son Guardar Nueva Cuenta, Actualizar Producto, Mostrar Post) manipulando el modelo y dirigiendo los datos hacia la vista.

Page 24: Desarrollo Agil con Ruby Y Rails

Rails::Framework::Ventajas

Fran Diéguez

● Usar un framework nos permite:

● no reinventar la rueda con cada proyecto

● automatizar las tareas repetitivas en un proyecto

● automatizar tareas complejas, comunes a todos los proyectos

● colaborar con otros usuarios del framework con poco o ningún esfuerzo

● invertir más tiempo en nuestro proyecto y menos en nuestra implementación

Page 25: Desarrollo Agil con Ruby Y Rails

Rails::Instalación

Fran Diéguez

● Instalación multiplataforma

● Utiliza el sistema de empaquetado de Ruby

– sudo gem install rails [-v 2.1]

● Instala ya todas las dependencias que necesita

● En Mac OS Leopard de serie

● O utilizar paquetes de instalación:

– InstantRails, Locomotive...

Page 26: Desarrollo Agil con Ruby Y Rails

Rails::Filosofía

Fran Diéguez

● Código más legible

● Tiempos de desarrollo más cortos

● No te Repitas (DRY)

● No hay tiempo de compilación

● Convención sobre configuración

● Testear, testear, testear

Page 27: Desarrollo Agil con Ruby Y Rails

Rails::Convention over Configuration

Page 28: Desarrollo Agil con Ruby Y Rails

Rails::Convention over Configuration

Más Rails Menos código

Page 29: Desarrollo Agil con Ruby Y Rails

Rails::Por dentro

● Rails tiene una modularidad excelente

● Permite substituír cada módulo por otro de forma “sencilla”

● Que Módulos?

● Active Support

● Active Record

● Action Pack

● Action Controller

● Action View

● Action Mailer

● Active Resource

● Action Web Service

● Railties

Page 30: Desarrollo Agil con Ruby Y Rails

Rails::Por dentro

● Active Support

● Active Record

● Action Pack

● Action Controller

● Action View

● Action Mailer

● Active Resource

● Action Web Service

● Railties

Clases genéricas que extienden Ruby para Rails

Page 31: Desarrollo Agil con Ruby Y Rails

Rails::Por dentro

● Active Support

● Active Record

● Action Pack

● Action Controller

● Action View

● Action Mailer

● Active Resource

● Action Web Service

● Railties

Implementa el patrón ActiveRecord para ORM

Page 32: Desarrollo Agil con Ruby Y Rails

Rails::Por dentro

● Active Support

● Active Record

● Action Pack

● Action Controller

● Action View

● Action Mailer

● Active Resource

● Action Web Service

● Railties

Parte del Controlador, Vistas, Rutas

Page 33: Desarrollo Agil con Ruby Y Rails

Rails::Por dentro

● Active Support

● Active Record

● Action Pack

● Action Controller

● Action View

● Action Mailer

● Active Resource

● Action Web Service

● Railties

Parte del Controlador

Page 34: Desarrollo Agil con Ruby Y Rails

Rails::Por dentro

● Active Support

● Active Record

● Action Pack

● Action Controller

● Action View

● Action Mailer

● Active Resource

● Action Web Service

● Railties

Parte de las Vistas

Page 35: Desarrollo Agil con Ruby Y Rails

Rails::Por dentro

● Active Support

● Active Record

● Action Pack

● Action Controller

● Action View

● Action Mailer

● Active Resource

● Action Web Service

● Railties

Gestion de envio de mensajes (mail, notificaciones,...)

Page 36: Desarrollo Agil con Ruby Y Rails

Rails::Por dentro

● Active Support

● Active Record

● Action Pack

● Action Controller

● Action View

● Action Mailer

● Active Resource

● Action Web Service

● Railties

Active Record para recursos web.

Page 37: Desarrollo Agil con Ruby Y Rails

Rails::Por dentro

● Active Support

● Active Record

● Action Pack

● Action Controller

● Action View

● Action Mailer

● Active Resource

● Action Web Service

● Railties

Creación de servicios web.

Page 38: Desarrollo Agil con Ruby Y Rails

Rails::Por dentro

● Active Support

● Active Record

● Action Pack

● Action Controller

● Action View

● Action Mailer

● Active Resource

● Action Web Service

● Railties Todo lo demás (javascripts, css, generadores,

scripts,etc, etc...)

Page 39: Desarrollo Agil con Ruby Y Rails

Rails::ActionPack::ActionController

● Cada controlador, una clase de Ruby

● Cada método, una acción

● Andamios (scaffold) para avanzar más rápido avanzar más rápido

Page 40: Desarrollo Agil con Ruby Y Rails

Rails::ActionPack

Page 41: Desarrollo Agil con Ruby Y Rails

Rails::ActionPack

Pero todo esto es

mejor verlo en vivo

Page 42: Desarrollo Agil con Ruby Y Rails

Rails::ActionPack::Sistema de Rutas

● Se llevan a cabo en el RAILS_ROOT/config/routes.rb

● Se cargan en cada petición si estamos en modo produccion

● Existen distintos tipos

● Sigue el sistema REST

Page 43: Desarrollo Agil con Ruby Y Rails

Rails::ActionPack::Partials

Fran Diéguez

● Pedazos de código reutilizable, explicitamente de las vistas.

● Se pueden definir partials para cada vista

● La convención nos dice que se deben nombrar con

_nombredelpartial.erb (Rails 2.0)● Hay que tener cabeza y saberlos diseñar para que se puedan

reutilizar al máximo

Page 44: Desarrollo Agil con Ruby Y Rails

Rails::ActionPack::Partials

Fran Diéguez

● Para utilizarlos desde una vista basta poner

<%= render_partial “producto” %>● Y luego crear el archivo _producto.erb con el código del partial que

queramos nosotros.

● Los partials soportan varias opciones

– render :partial => 'producto'

– render :partial => 'producto', :locals => { :product => @producto }

– render :partial => 'producto', :collection => @lista_productos

Page 45: Desarrollo Agil con Ruby Y Rails

Rails::ActionPack::Helpers

Fran Diéguez

● Pedazos de código que simplifican los componentes generando código html

● Cada modelo tiene su propio conjunto de helpers

● Rails proporciona genéricos

– Quien no ha escrito un formulario?

– Quien no ha escrito un vínculo?

Page 46: Desarrollo Agil con Ruby Y Rails

Rails::ActionPack::Helpers

Fran Diéguez

<%= truncate articulo.contenido, 9 %>

#=> La infant...

<%= image_tag 'federico.png' %>

<%= link_to 'Ver más', {:controller => 'pagina', :action => 'show', :id => pagina.id}%>

<%= form_for (@articulo)%>

#=> <form action=”/articulo/” method=”post”>

Page 47: Desarrollo Agil con Ruby Y Rails

Rails::ActionPack::Helpers

Fran Diéguez

● Para crear helpers podemos hacerlo de dos formas:

– Hacerlos visibles para toda la app

=> application_helper.rb

– Hacerlos visibles sólo para un modelo

=> nombremodelo_helper.rb

Page 48: Desarrollo Agil con Ruby Y Rails

Rails::ActionPack::Helpers::Ejemplo

Fran Diéguez

Page 49: Desarrollo Agil con Ruby Y Rails

Rails::Railties::Plugins

Fran Diéguez

● Multiples propósitos

● Testeados

● Instalación muy sencilla

– script/plugin install <dirección>

Page 50: Desarrollo Agil con Ruby Y Rails

Rails::ActiveRecord

● Sin duda la clase más potente de Rails

● Se encarga del modelo de datos de nuestra app

● Para eso mapea las tablas en clases de ActiveRecord, y

las columnas de cada tabla en atributos (ORM)

● Veamos unos ejemplos sobre mapeado con el señor AR

Page 51: Desarrollo Agil con Ruby Y Rails

Rails::ActiveRecord::Relaciones

Page 52: Desarrollo Agil con Ruby Y Rails

Rails::ActiveRecord::Relaciones

Page 53: Desarrollo Agil con Ruby Y Rails

Rails::ActiveRecord::Relaciones

Page 54: Desarrollo Agil con Ruby Y Rails

Rails::ActiveRecord::Validación

● AR también proporciona validación de datos tanto al crear como al actualizar:

● Para eso proporciona distintos métodos que colocaremos en nuestra clase de

definición de modelo:

Page 55: Desarrollo Agil con Ruby Y Rails

Rails::ActiveRecord::Metodos Virtuales

● AR da mucha flexibilidad para crear métodos virtuales (que no

tienen correspondencia con los datos en tabla:

Page 56: Desarrollo Agil con Ruby Y Rails

Rails::ActiveRecord::Calculos

● AR proporciona diversos métodos de calculo sobre los datos

Lo que automáticamente traduce en...

Page 57: Desarrollo Agil con Ruby Y Rails

Rails::ActiveRecord::Find

● Pero sin duda los métodos que más se usan, son la familia find

● Por defecto find busca a nivel de id.

● AR crea dinámicamente métodos find para cada atributo de la

tabla

Page 58: Desarrollo Agil con Ruby Y Rails

Rails::ActiveRecord::Callbacks● AR proporciona varios niveles de callbacks en los modelos

Page 59: Desarrollo Agil con Ruby Y Rails

Rails::Railties::Console

● Muy usable para testear tu código

● Probar nuevos métodos sin escribirlos

● Modo Sandbox

● Para iniciar, desde una terminal:

– script/console

Page 60: Desarrollo Agil con Ruby Y Rails

Rails::Caché

● No voy a contar mucho aquí pero podemos decir

– Tiene un sistema de caché integrado arcaico pero muy muy optimizable.

– Arcaico = todo lo tienes que hacer tu.

– Rails proporciona diversos métodos para expirar caché que principalmente se implementan con callbacks en los modelos

– Lo más usable es usar un “sweeper”.

Page 61: Desarrollo Agil con Ruby Y Rails

Rails::Caché

● Proporciona diversos métodos de gestionar la caché:

– Cache de fragmentos

– Caché de página

– Caché de acción

● Además de proporcionar distintos métodos de almacenamiento:

– Caché en disco

– Caché en memcached

– Caché en drb

Page 62: Desarrollo Agil con Ruby Y Rails

Rails::WebServers

● Por defecto, Rails intenta usar Mongrel y lighttpd si están instalados, en su defecto usa WEBrick, servidor web que viene por defecto con Ruby.

● Se seleccionarán en dicho orden, para que siempre haya algún modo de tener un servidor levantado.

● Mongrel es un servidor web escrito en Ruby con componentes en C, está diseñado tanto para desarrollo como para producción.

Page 63: Desarrollo Agil con Ruby Y Rails

Rails::WebServers

● Lo más normal es usar nginx o lighttpd como servidor web proxy inverso atacando contra una batería de mongrels.

● Y desde hace pocos meses existe un módulo para Apache2 que permite la puesta en producción me manera muy, muy sencilla.

● Como último recurso siempre podemos correr nuestra aplicación mediante FastCGI, SCGI o CGI. :(

Page 64: Desarrollo Agil con Ruby Y Rails

Rails::Testing

Fran Diéguez

● Frente a otros lenguajes te “obliga” a testear tus apps

– Testear != Debugear

– En Rails prima el TDD (Test Driven Development)

● Rails Proporciona

– Tests Unitarios

– Tests Funcionales

– Tests de Integración

Page 65: Desarrollo Agil con Ruby Y Rails

Rails::Testing

Fran Diéguez

tudu $ rake -T test

rake db:test:clone # Recreate the test database from the current...

rake db:test:clone_structure # Recreate the test databases from the develo...

rake db:test:prepare # Prepare the test database and load the schema

rake db:test:purge # Empty the test database

rake test # Run all unit, functional and integration tests

rake test:functionals # Run tests for functionalsdb:test:prepare / ...

rake test:integration # Run tests for integrationdb:test:prepare / ...

rake test:plugins # Run tests for pluginsenvironment / Run the ...

rake test:recent # Run tests for recentdb:test:prepare / Test ...

rake test:uncommitted # Run tests for uncommitteddb:test:prepare / ...

rake test:units

Page 66: Desarrollo Agil con Ruby Y Rails

Rails::Testing

Fran Diéguez

Pero echad un ojo a

Instalación: sudo gem install ZenTest

Autotest

Page 67: Desarrollo Agil con Ruby Y Rails

Recursos

Page 68: Desarrollo Agil con Ruby Y Rails

Recursos::Comunidad

Fran Diéguez

● Parte esencial

– En españa y en español:

● http://lists.simplelogica.net/mailman/listinfo/ror-es

● https://listas.escomposlinux.org/mailman/listinfo/rubies

– Muy muy muy muy activa (liberan mucho código)

– Muy buena gente

Page 69: Desarrollo Agil con Ruby Y Rails

Recursos :: Libros :: Ruby

Fran Diéguez

Page 70: Desarrollo Agil con Ruby Y Rails

Recursos :: Libros :: Rails

Fran Diéguez

Page 71: Desarrollo Agil con Ruby Y Rails

Recursos :: Libros :: Rails

Fran Diéguez

Page 72: Desarrollo Agil con Ruby Y Rails

Recursos :: Documentación

Fran Diéguez

● Ruby● http://www.ruby-doc.org/stdlib/

● http://www.ruby-doc.org/core/

● Rails● http://api.rubyonrails.org/

● Ambos: http://www.noobkit.com/

Page 73: Desarrollo Agil con Ruby Y Rails

Preguntas?

Page 74: Desarrollo Agil con Ruby Y Rails

Recursos::Referencias

Fran Diéguez

Libros

● “Programming Ruby”, Dave Thomas

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

● http://www.rubyonrails.org/

Fotografías:

● http://flickr.com/photos/miscellaneous/2211634407/

● http://flickr.com/photos/miscellaneous/2177842637/

● http://flickr.com/photos/minebilder/96540617/

Page 75: Desarrollo Agil con Ruby Y Rails

Gracias