Ruby on Rails
-
Upload
aabbccddeeee -
Category
Documents
-
view
349 -
download
2
description
Transcript of Ruby on Rails
Ruby on Rails - Javier Espinazo Pagán - Febrero 2005/2006
1
Ruby on RailsDesarrollo Web Ágil
Javier Espinazo PagánConvocatoria Febrero 2005/2006
Ruby on Rails - Javier Espinazo Pagán - Febrero 2005/2006
2
¿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
3
¿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
4
¿Qué es Ruby? (Ejemplos)
class Filedef File.open_and_process(*args)
f = File.open(*args)yield ff.close()
endend
File.open_and_process("testfile", "r") do |file|while line = file.gets
puts lineend
end
Linea unoLinea dos…
Ruby on Rails - Javier Espinazo Pagán - Febrero 2005/2006
5
¿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
6
¿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
7
¿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
8
¿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
9
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
10
El Modelo: Active Record (2)
Ejemplo: Creamos una tabla “orders” de órdenes de compra:
create table orders {id int not null auto_increment,name varchar(100) not null,email varchar(255) not null,address text not null,pay_type char(10) not null,shipped_at datetime null,primary key (id)
};
Ruby on Rails - Javier Espinazo Pagán - Febrero 2005/2006
11
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
12
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()
Borrar: utilizando delete() o delete_all()
Ruby on Rails - Javier Espinazo Pagán - Febrero 2005/2006
13
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
14
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
15
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 StoreHelperdef 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
16
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
17
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 por defecto
Ruby on Rails - Javier Espinazo Pagán - Febrero 2005/2006
18
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
19
El Controlador: Action Controller (2)
Cookies programáticas intuitivas Ejemplo:
Class CookiesController < ApplicationControllerdef accion_uno
cookies[:preferencia] = “música”redirect_to :action => “accion_dos”
enddef 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
20
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
21
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 < ApplicationControllerverify :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
22
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
23
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
24
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 ligeras-intermedias.
Ruby on Rails - Javier Espinazo Pagán - Febrero 2005/2006
25
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