Download pdf - Ruby on Rails

Transcript
Page 1: 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

Page 2: Ruby on Rails

Ruby on Rails - Javier Espinazo Pagán -Febrero 2005/2006

2

¿Qué es Ruby?

Lenguaje interpretado Orientado a ObjetosTipado dinámicamente y similar a Perl y PhytonSintaxis simple, clara y uniformeBiblioteca de clases extensa e intuitivaUtilización de bloques para parametrizarmétodos (iteradores, listeners) y buclesTipos primitivos son también clases y permiten ejecución seguraManejo avanzado de expresiones regulares y cadenas de texto

Page 3: Ruby on Rails

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) doprint "#{$`}<<#{$&}>>#{$'}“yield

endelse

“no coincide”end

end

analizar_expresion(“Ruby on Rails”, /R+l/, 8) doprint “coincide”

end

Ruby on <<Rail>>s coincide coincide coincide

Page 4: Ruby on Rails

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…

Page 5: Ruby on Rails

Ruby on Rails - Javier Espinazo Pagán -Febrero 2005/2006

5

¿Qué es Rails?

Framework de desarrollo web con RubyManifiesto Ágil:

Individuo e interacciones antes que procesos y herramientasDesarrollar software antes que documentarColaborar con el cliente antes que negociar contratosResponder al cambio antes que seguir un plan

Don’t Repeat Yourself (DRY)

Page 6: Ruby on Rails

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

Page 7: Ruby on Rails

Ruby on Rails - Javier Espinazo Pagán -Febrero 2005/2006

7

¿Qué es Rails? (3)

Arquitectura Modelo-Vista-ControladorModelo: Active Record

ORM para RailsUtiliza convenciones para minimizar la configuraciónAbstracción de alto nivel

Vista: Action ViewFicheros RHTML y XMLObjetos del Controlador accesibles y variables de entornoMódulos Helper

Controlador: Action ControllerResolución inteligente de dependenciasFácil configuración de dependenciasManejo sencillo de cookies, sesiones y variables de la conexión

Page 8: Ruby on Rails

Ruby on Rails - Javier Espinazo Pagán -Febrero 2005/2006

8

¿Qué es Rails? (5)

Facilidad de configuraciónMinimiza los ficheros de configuración mediante el uso estandarizado y jerárquico de directorios:

app/: modelos, vistas y controladoresconf/: configuración general y de conexiones a BBDDdb/: esquemas de BBDDdoc/: documentación autogeneradalog/: bitácora de la ejecuciónscript/: scripts de utilidadestest/: tests unitarios, funcionales, etc.

Diferentes modos de funcionamiento en base al tipo de ejecución

Page 9: Ruby on Rails

Ruby on Rails - Javier Espinazo Pagán -Febrero 2005/2006

9

El Modelo: Active Record

ORM propio de Rails cercano al estándarFacilidad de asociación clase-tabla:

Clase debe heredar de ActiveRecord::BaseRails asume el nombre de la tabla como el plural del nombre de la clase (método pluralize()).Permite asociación explícitaAtributos de la clase se infieren en tiempo de ejecución

Manejo automatizado de claves primarias

Page 10: Ruby on Rails

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)

};

Page 11: Ruby on Rails

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

Page 12: Ruby on Rails

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 primariaConsulta explícita en SQL con comodines dinámicos (placeholders)

Actualizar: utilizando save(), update(), update_attribute() o update_attributes()Borrar: utilizando delete() o delete_all()

Page 13: Ruby on Rails

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 relacionesTransacciones implementadas como bloques:

Bloques utilizados con el método transaction() de ActiveRecord::Base se ejecutan transaccionalmenteSi se aborta la transacción, los cambios no afectan a la BBDD pero sí al programa clienteNecesidad de utilizar cláusulas rescue de tratamiento de excepciones para dejar los datos de programa consistentes

Page 14: Ruby on Rails

Ruby on Rails - Javier Espinazo Pagán -Febrero 2005/2006

14

La vista: Action View

Creación programática de ficheros XML: clase BuilderCódigo HTML + código Ruby = plantillas RHTMLVariables de instancia del controlador y controlador disponibles en la vistaVariables 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 legibilidadSolución: módulos Helper

Page 15: Ruby on Rails

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 compartirlosEjemplo:

Controlador StoreController tiene StoreHelper:module StoreHelper

def page_title@page_title = “Título general”

endend

Ahora en el fichero store.rhtml podemos usar:<h3><%= page_title =%><h3>

Page 16: Ruby on Rails

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 HTMLTambién mail_to(), button_to(), etc

Ayuda para la paginación de listados grandesMétodo paginate() en el controlador y pagination_links()en la vista (RHTML)

Helpers específicos paraFormularios (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)

Page 17: Ruby on Rails

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.rbActionController::Routing::Routes.drawmap.connectDefinir asociaciones con patrones (expresiones regulares)Asociaciones nombradas

Creación programática de URLs con url_for()Utiliza las asociaciones definidas anteriormenteAsume valores por defecto

Page 18: Ruby on Rails

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, dominioparams: parámetros de la petición (formularios, URL…)cookies y session: manejo de sesión en forma de hashheaders: cabeceras HTTP para la respuesta

Comunicación entre acciones: flashHash similar a un Portapapeles, guarda anotaciones, mensajes de advertencia o error, etc.

Page 19: Ruby on Rails

Ruby on Rails - Javier Espinazo Pagán -Febrero 2005/2006

19

El Controlador: Action Controller (2)

Cookies programáticas intuitivasEjemplo:

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}”)

endend

Cada cookie es también un hash (:value, :expires, :path)Manejo similar para sesiones (session)

Page 20: Ruby on Rails

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 PStoreDRb: BBDD distribuida de objetos para RubyMemory: 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)

Page 21: Ruby on Rails

Ruby on Rails - Javier Espinazo Pagán -Febrero 2005/2006

21

El Controlador: Action Controller (4)

Soporte de AOP: filterafter_filter, before_filter, around_filterLos declara el método filtrado => acoplamiento

Verificación se consigue con filtrosSe 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

Page 22: Ruby on Rails

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áficosCallbacks

Manejo de e-mails con Action MailerWeb Services con Action Web ServiceManejo de escalabilidad basado en persistencia en BBDD centralizada, compartición nula entre aplicaciones y sistema de caché centralizada

Page 23: Ruby on Rails

Ruby on Rails - Javier Espinazo Pagán -Febrero 2005/2006

23

Conclusiones

Desarrollo Web realmente rápido y sencilloIntegración de la aplicación Web de forma natural en el código

No hacen falta clases “extrañas” como en EJB o SpringNo hacen falta muchos ficheros de configuración extensosUtilización de directivas para crear las dependenciasUtilización de jerarquía de directorios para dependencias

Los resultados se ven inmediatamenteModificación “en caliente” de la aplicación en modo desarrolloFacilita interacción con el cliente

Page 24: Ruby on Rails

Ruby on Rails - Javier Espinazo Pagán -Febrero 2005/2006

24

Conclusiones (2)

Abstracción de la complejidad de negocioBuena 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 nivelControl 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.

Page 25: Ruby on Rails

Ruby on Rails - Javier Espinazo Pagán -Febrero 2005/2006

25

Bibliografía

Agile Web Development With RailsDave Thomas & David Heinemeier HanssonThe Pragmatic Bookshelf2005

Programming Ruby 2nd EditionDave ThomasThe Pragmatic Bookshelf2005

http://www.rubyonrails.orghttp://www.rubyist.net/~slagell/ruby/index.html

Tutorial de Ruby online y descargable