Ruby on Rails
Desarrollo Web Ágil
Javier Espinazo Pagán
Convocatoria Febrero 2005/2006
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
1
¿Qué es Ruby?
 Lenguaje interpretado Orientado a Objetos
 Tipado dinámicamente y similar a Perl y Phyton
 Sintaxis simple, clara y uniforme
 Biblioteca de clases extensa e intuitiva
 Utilización de bloques para parametrizar
métodos (iteradores, listeners) y bucles
 Tipos primitivos son también clases y permiten
ejecución segura
 Manejo avanzado de expresiones regulares y
cadenas de texto
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
2
¿Qué es Ruby? (Ejemplos)
def analizar_expresion(texto, expr, entero)
if texto =~ expr
entero.upto(10) do
print "#{$`}<<#{$&}>>#{$'}“
yield
end
else
“no coincide”
end
end
analizar_expresion(“Ruby on Rails”, /R+l/, 8) do
print “coincide”
end
Ruby on <<Rail>>s coincide coincide coincide
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
3
¿Qué es Ruby? (Ejemplos)
class File
def File.open_and_process(*args)
f = File.open(*args)
yield f
f.close()
end
end
File.open_and_process("testfile", "r") do |file|
while line = file.gets
puts line
end
end
Linea uno
Linea dos
…
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
4
¿Qué es Rails?
 Framework de desarrollo web con Ruby
 Manifiesto Ágil:
 Individuo e interacciones antes que procesos y
herramientas
 Desarrollar software antes que documentar
 Colaborar con el cliente antes que negociar contratos
 Responder al cambio antes que seguir un plan
 Don’t Repeat Yourself (DRY)
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
5
¿Qué es Rails? (2)
 Individuo e interacciones antes que procesos y
herramientas:
 Es más conveniente crear primero el equipo de programación y
que éste configure su propio entorno de desarrollo en base a
sus necesidades
 Desarrollar software antes que documentar:
 No producir documentos a menos que sean necesarios de forma
inmediata. Documentación breve y concisa
 Colaborar con el cliente antes que negociar contratos:
 Interacción constante entre cliente y equipo
 Responder al cambio antes que seguir un plan:
 Planificación flexible y abierta
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
6
¿Qué es Rails? (3)
 Arquitectura Modelo-Vista-Controlador
 Modelo: Active Record
 ORM para Rails
 Utiliza convenciones para minimizar la configuración
 Abstracción de alto nivel
 Vista: Action View
 Ficheros RHTML y XML
 Objetos del Controlador accesibles y variables de entorno
 Módulos Helper
 Controlador: Action Controller
 Resolución inteligente de dependencias
 Fácil configuración de dependencias
 Manejo sencillo de cookies, sesiones y variables de la conexión
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
7
¿Qué es Rails? (5)
 Facilidad de configuración
 Minimiza los ficheros de configuración mediante el uso
estandarizado y jerárquico de directorios:
 app/: modelos, vistas y controladores
 conf/: configuración general y de conexiones a BBDD
 db/: esquemas de BBDD
 doc/: documentación autogenerada
 log/: bitácora de la ejecución
 script/: scripts de utilidades
 test/: tests unitarios, funcionales, etc.
 Diferentes modos de funcionamiento en base al tipo
de ejecución
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
8
El Modelo: Active Record
 ORM propio de Rails cercano al estándar
 Facilidad de asociación clase-tabla:
 Clase debe heredar de ActiveRecord::Base
 Rails asume el nombre de la tabla como el plural del
nombre de la clase (método pluralize()).
 Permite asociación explícita
 Atributos de la clase se infieren en tiempo de ejecución
 Manejo automatizado de claves primarias
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
9
El Modelo: Active Record (2)
 Ejemplo:
Creamos una tabla “orders” de órdenes de compra:
create table orders {
id
int
name
varchar(100)
email
varchar(255)
address
text
pay_type
char(10)
shipped_at
datetime
primary key (id)
};
not null auto_increment,
not null,
not null,
not null,
not null,
null,
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
10
El Modelo: Active Record (3)
Ejemplo (sigue):
Ahora queremos acceder a un objeto de la tabla
“orders”, para lo que declaramos:
class Order < ActiveRecord::Base
Rails resuelve las asociaciones y ya podemos
utilizar objetos de la tabla:
order = Order.find(123)
order.name = “Javier Espinazo”
order.save
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
11
El Modelo: Active Record (4)
 Conectar con una BBDD es tán fácil como rellenar un hash:
ActiveRecord::Base.establish_connection(
:adapter => “mysql”
:host => “servidorBBDD.com”
:database => “baseDeDatos”
:username => “nombreUsuario”
:password => “claveUsuario”
)
 Las operaciones CRUD se realizan con métodos sencillos:
 Crear: creamos un objeto con new() y lo guardamos con save().
 Leer: poderoso método find() que admite
 Clave primaria
 Consulta explícita en SQL con comodines dinámicos (placeholders)
 Actualizar: utilizando save(), update(), update_attribute() o
update_attributes()
Ruby on Rails - Javier Espinazo Pagán  Borrar: utilizando delete()
oFebrero
delete_all()
2005/2006
12
El Modelo: Active Record (5)
 Relaciones entre tablas se especifican intuitivamente:
 Directivas has_one, has_many, belongs_to y
has_and_belongs_to_many en la declaración de clase
 Las directivas generan métodos para manejar las
relaciones
 Transacciones implementadas como bloques:
 Bloques utilizados con el método transaction() de
ActiveRecord::Base se ejecutan transaccionalmente
 Si se aborta la transacción, los cambios no afectan a la BBDD
pero sí al programa cliente
 Necesidad de utilizar cláusulas rescue de tratamiento de
excepciones para dejar los datos de programa consistentes
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
13
La vista: Action View
 Creación programática de ficheros XML: clase
Builder
 Código HTML + código Ruby = plantillas RHTML
 Variables de instancia del controlador y
controlador disponibles en la vista
 Variables de sesión y conexión disponibles en la
vista (menos usadas)
 Código Ruby al estilo de JSP => duplicación de
código y poca legibilidad
 Solución: módulos Helper
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
14
La vista: Action View (2)
 Define métodos que pueden ser llamados por el RHTML =>
código más corto, más legible y centralizado (principio DRY)
 Un Helper por defecto para cada controlador y también
podemos definir nuevos o compartirlos
 Ejemplo:
 Controlador StoreController tiene StoreHelper:
module StoreHelper
def page_title
@page_title = “Título general”
end
end
 Ahora en el fichero store.rhtml podemos usar:
<h3><%= page_title =%><h3>
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
15
La vista: Action View (3)
 Creación programática de enlaces con link_to()
Especificamos mensaje, destino y atributos HTML
También mail_to(), button_to(), etc
 Ayuda para la paginación de listados grandes
Método paginate() en el controlador y pagination_links()
en la vista (RHTML)
 Helpers específicos para
Formularios (form_tag)
Cuadros de texto, botones, etc.
Permiten asociar los elementos HTML con
acciones en los controladores (hash params)
 Manejo programático de plantillas CSS (layouts)
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
16
El Controlador: Action Controller
 Sistema de routing inteligente basado en la jerarquía de
la URL:
 Ejemplo:
http://ejemplo.com/repositorio/obtener_ejemplo/123 ejecuta
RepositorioController.obtener_ejemplo(123)
 Si no se encuentra levanta excepción method_missing
 Configuración explícita en routes.rb
 ActionController::Routing::Routes.draw
 map.connect
 Definir asociaciones con patrones (expresiones regulares)
 Asociaciones nombradas
 Creación programática de URLs con url_for()
 Utiliza las asociaciones definidas anteriormente
 Asume valores porRuby
defecto
on Rails - Javier Espinazo Pagán Febrero 2005/2006
17
El Controlador: Action Controller (2)
 Variables de contexto:
request: ip remota, tipo de petición, dominio
params: parámetros de la petición (formularios, URL…)
cookies y session: manejo de sesión en forma de hash
headers: cabeceras HTTP para la respuesta
 Comunicación entre acciones: flash
Hash similar a un Portapapeles, guarda anotaciones,
mensajes de advertencia o error, etc.
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
18
El Controlador: Action Controller (2)
 Cookies programáticas intuitivas
 Ejemplo:
Class CookiesController < ApplicationController
def accion_uno
cookies[:preferencia] = “música”
redirect_to :action => “accion_dos”
end
def accion_dos
cookie_value = cookies[:preferencia]
render(:text => “Parece que quiere hablar de #{cookie_value}”)
end
end
 Cada cookie es también un hash (:value, :expires, :path)
 Manejo similar para sesiones (session)
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
19
El Controlador: Action Controller (3)
 Sesiones ofrecen varias propiedades:
 database_manager, domain, id, key, path, expires…
 database_manager => persistencia:
 PStore: fichero plano en formato PStore
 DRb: BBDD distribuida de objetos para Ruby
 Memory: memoria local de la aplicación ()
 File: fichero plano ()
 ActiveRecord: BBDD (MySQL, Oracle, etc.). Creación de
tablas mediante DDL y serialización de objetos mediante
YAML (similar a Properties de Java)
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
20
El Controlador: Action Controller (4)
 Soporte de AOP: filter
 after_filter, before_filter, around_filter
 Los declara el método filtrado => acoplamiento
 Verificación se consigue con filtros
 Se intancia como un hash. Ejemplo:
class BlogController < ApplicationController
verify :only => :post_comment,
:session => :user_id,
:add_flash => { :note => “You must log in”},
:redirect_to => :index
…
end
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
21
Otras características
 Soporte integrado de AJAX:
 link_to_remote(), form_remote_tag(), observe_field(),
periodically_call_remote()
 Efectos gráficos
 Callbacks
 Manejo de e-mails con Action Mailer
 Web Services con Action Web Service
 Manejo de escalabilidad basado en persistencia
en BBDD centralizada, compartición nula entre
aplicaciones y sistema de caché centralizada
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
22
Conclusiones
 Desarrollo Web realmente rápido y sencillo
 Integración de la aplicación Web de forma
natural en el código
 No hacen falta clases “extrañas” como en EJB o Spring
 No hacen falta muchos ficheros de configuración extensos
 Utilización de directivas para crear las dependencias
 Utilización de jerarquía de directorios para dependencias
 Los resultados se ven inmediatamente
 Modificación “en caliente” de la aplicación en modo
desarrollo
 Facilita interacción con el cliente
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
23
Conclusiones (2)
 Abstracción de la complejidad de negocio
 Buena implementación del patrón MVC hace que las
clases de negocio sean muy independientes
 Framework moderno (AJAX, Web Services)
 Inconvenientes:
 Ruby es un lenguaje de muy alto nivel
 Control limitado sobre eficiencia y rendimiento
 Manejo muy abstracto de la BBDD (arma de doble filo)
 Convenciones de nombres en inglés (método pluralize())
 En general, adecuado para aplicaciones ligerasintermedias.
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
24
Bibliografía
 Agile Web Development With Rails
 Dave Thomas & David Heinemeier Hansson
 The Pragmatic Bookshelf
 2005
 Programming Ruby 2nd Edition
 Dave Thomas
 The Pragmatic Bookshelf
 2005
 http://www.rubyonrails.org
 http://www.rubyist.net/~slagell/ruby/index.html
 Tutorial de Ruby online y descargable
Ruby on Rails - Javier Espinazo Pagán Febrero 2005/2006
25
Descargar

Ruby on Rails