Desarrollo Ágil con Ruby y Rails
Fran Diéguez [email protected]
Que vamos a ver
● Lenguaje Ruby
● Rails
● Puesta en producción
● Recursos
Grupo de usuarios de GNU/Linux da Galiza
Lenguaje Ruby
Grupo de usuarios de GNU/Linux da Galiza
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
Ruby::Puntos clave
Grupo de usuarios de GNU/Linux da Galiza
● Dinámico● Completo● Orientado a objetos
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
Ruby::Filosofía
Fran Diéguez
● "Principio de la menor sorpresa"
Hace lo que tiene que hacer como esperas
que lo haga
Ruby::Ejemplos
Siempre se devuelve el último elemento evaluado
@usuario = if params[:id]
User.fi nd(:id)
else
User.new
end
Fran Diéguez
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
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
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
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
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
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]
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]
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
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
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
Ruby :: Orientado a objetos
z
Ruby :: Orientado a objetos
Más Ruby Menos código
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>
Rails (por fin...)
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.
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
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...
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
Rails::Convention over Configuration
Rails::Convention over Configuration
Más Rails Menos código
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
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
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
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
Rails::Por dentro
● Active Support
● Active Record
● Action Pack
● Action Controller
● Action View
● Action Mailer
● Active Resource
● Action Web Service
● Railties
Parte del Controlador
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
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,...)
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.
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.
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...)
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
Rails::ActionPack
Rails::ActionPack
Pero todo esto es
mejor verlo en vivo
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
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
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
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?
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”>
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
Rails::ActionPack::Helpers::Ejemplo
Fran Diéguez
Rails::Railties::Plugins
Fran Diéguez
● Multiples propósitos
● Testeados
● Instalación muy sencilla
– script/plugin install <dirección>
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
Rails::ActiveRecord::Relaciones
Rails::ActiveRecord::Relaciones
Rails::ActiveRecord::Relaciones
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:
Rails::ActiveRecord::Metodos Virtuales
● AR da mucha flexibilidad para crear métodos virtuales (que no
tienen correspondencia con los datos en tabla:
Rails::ActiveRecord::Calculos
● AR proporciona diversos métodos de calculo sobre los datos
Lo que automáticamente traduce en...
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
Rails::ActiveRecord::Callbacks● AR proporciona varios niveles de callbacks en los modelos
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
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”.
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
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.
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. :(
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
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
Rails::Testing
Fran Diéguez
Pero echad un ojo a
Instalación: sudo gem install ZenTest
Autotest
Recursos
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
Recursos :: Libros :: Ruby
Fran Diéguez
Recursos :: Libros :: Rails
Fran Diéguez
Recursos :: Libros :: Rails
Fran Diéguez
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/
Preguntas?
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/
Gracias