Top Banner
Introducción a Ruby On Rails Ing. Pablo Marrero
57

Introducción a RubyOnRails

Jan 13, 2015

Download

Technology

Pablo Marrero

Introducción al framework dictada en la Facultad de Ingeniería de la UDELAR
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Introducción a RubyOnRails

Introducción

a

Ruby On Rails

Ing. Pablo Marrero

Page 2: Introducción a RubyOnRails

Agenda

Ing. Pablo Marrero

• Introducción • Qué es Ruby On Rails?• Historia

• Pilares de RoR• Ruby• Convención sobre Configuración• DRY• Active Record (ORM)• Migrations

• A codificar!• Instalación de Ruby y RoR • Herramientas de desarrollo• Ejemplo “mini” proyecto

Page 3: Introducción a RubyOnRails

Introducción

Ing. Pablo Marrero

• Qué es Ruby On Rails?• Framework para Desarrollo de Aplicaciones Web

• Brinda un Stack completo

Java

Hibernate TopLink

JPA

EJB Spring

Struts JSF

Ruby on Rails

Page 4: Introducción a RubyOnRails

Introducción

Ing. Pablo Marrero

• Qué es Ruby On Rails?• Framework para Desarrollo de Aplicaciones Web

• Brinda un Stack completo

Java

Hibernate TopLink

JPA

EJB Spring

Struts JSF

Ruby on Rails

Active Record

Action Pack

Action View Action Controller

Page 5: Introducción a RubyOnRails

Introducción

Ing. Pablo Marrero

• Qué es Ruby On Rails?• Basado en el Patron Model-View-Controller

• Patrón de Arquitectura que separa los componentes de un sistema en tres roles

• Modelo – La presentación de los datos y su relación entre ellos (lógica de negocios)

• Vista – Interfaz de usuario• Controlador – Quien recibe los eventos

generados en la Vista, interactúa con el Modelo y decide la siguiente vista a mostrar

ModeloVista

ControladorBrowser

BD

Page 6: Introducción a RubyOnRails

Introducción

Ing. Pablo Marrero

• Un poco de historia…..• Creado por David Heinemeier Hansson (DHH)

• Extraído del desarrollo de Basecamp• Primera versión en Abril de 2004• Versión 1.0 liberada en Octubre de 2006

• Desde su aparición se han creado varios “portes”• Java

• Groovy (like Ruby) y Grails (like Rails)• Trails, basado en Tapestry-Spring-Hibernate

• Php• CakePHP

• Frameworks similares•Python

• Django

Page 7: Introducción a RubyOnRails

Agenda

Ing. Pablo Marrero

• Introducción • Qué es Ruby On Rails?• Historia

• Pilares de RoR• Ruby• Convención sobre Configuración• DRY• Active Record (ORM)• Migrations

• A codificar!• Instalación de Ruby y RoR • Herramientas de desarrollo• Ejemplo “mini” proyecto

Page 8: Introducción a RubyOnRails

Pilares de RoRRuby

Ing. Pablo Marrero

• RoR esta escrito sobre el lenguaje Ruby y esto es uno de los fundamentos de su éxito• Pero que es Ruby?

• Lenguaje de programación, interpretado y dinámico• Completamente orientado a objetos• Inspirado en Smalltalk, Perl, Python• Creado por Yukihiro “Matz” Matsumoto por 1993• Rápidamente desplaza a Python y pasa a ser el lenguaje más utilizado en Japón• Enfatiza la comodidad del programador más que de la máquina

Page 9: Introducción a RubyOnRails

Pilares de RoRRuby

Ing. Pablo Marrero

• Completamente orientado a objetos• En ruby todo es un objeto y toda operación que se realice sobre un objeto será invocando uno de sus métodos

5 + 3 // retorna 85.+(3) // idem anterior• Los operadores base del lenguaje también son métodos y por lo tanto los podemos sobrescribir

class Fixnumdef +(other) >> 5 + 3

self – other => 2end

end

Page 10: Introducción a RubyOnRails

Pilares de RoRRuby

Ing. Pablo Marrero

• Implementa únicamente herencia simple

• Para lograr comportamientos similares al de la herencia múltiple existen los mixins, que nos permite mezclar módulos dentro de la definición de una clase

• Se dice que brinda lo mejor de la herencia múltiple sin la complejidad de ésta

Page 11: Introducción a RubyOnRails

Pilares de RoRRuby

Ing. Pablo Marrero

• Veamos algunos ejemplos

variable_local

@variable_de_instancia

@@variable_de_clase

$variable_global

Clase

CONSTANTE

:simbolo

metodo_de_instancia

self.metodo_de_clase

modifico_el_objeto!

devuelvo_booleano?

Page 12: Introducción a RubyOnRails

Pilares de RoRRuby

Ing. Pablo Marrero

Las estructuras devuelven el valor de la ultima expresión evaluada:

@user = if params[:id]User.find(params[:id])

elseUser.new

end

Page 13: Introducción a RubyOnRails

Pilares de RoRRuby

Ing. Pablo Marrero

@post = Post.find(params[:id])if @post

@post.destroyend

Mejor:

if @post = Post.find(params[:id])@post.destroy

end

Page 14: Introducción a RubyOnRails

Pilares de RoRRuby

Ing. Pablo Marrero

Asignaciones condicionales

@title = "Tıtulo generico" unless defined?(@title)

@title ||= "Tıtulo generico“

@heading = if defined?(@subsection)@subsection.title

[email protected]

end

@heading = ( @subsection || @section ).title

Page 15: Introducción a RubyOnRails

Pilares de RoRRuby

Ing. Pablo Marrero

Arrays

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

Iterando:

@arr.each do |item|puts item

end

Que es el for de toda la vida:

for item in @arrputs item

end

Page 16: Introducción a RubyOnRails

Pilares de RoRRuby

Ing. Pablo Marrero

Utilidades Varias para Arrays.uniq

[1,1,2,3,3].uniq >> [1,2,3].flatten

[[1,1],2,[3,3]].flatten >> [1,1,2,3,3].compact

[1,nil,2,nil,3].compact >> [1,2,3].reverse

[1,1,2,3,3].reverse >> [3,3,2,1,1].sort

[1,3,2,1,3].sort >> [1,1,2,3,3].find

[1,2,3].find {|n| n % 3 == 0 } >> 3[1,2,3].find {|n| n % 5 == 0 } >> nil

.find_all[1,3,5,6].find_all {|n| n % 3 == 0 } >> [3,6][1,2,3].find_all {|n| n % 5 == 0 } >> []

Page 17: Introducción a RubyOnRails

Pilares de RoRRuby

Ing. Pablo Marrero

Que pasa con las clases?

class Personadef nombre

@nombreenddef nombre=(nombre)

@nombre = nombreend

end

No mas getter y setter!!

class Personaattr_accesor :nombre, :apellidoattr_reader :idattr_writer :notas

end

Page 18: Introducción a RubyOnRails

Pilares de RoRRuby

Ing. Pablo Marrero

• En resumen Ruby es un lenguaje• Dinámico• Orientado a objetos puro• Fácil de programar!

• Según su creador

Yukihiro MatsumotoOften people, especially computer engineers, focus on the machines. They think, "By doing this, the machine will run faster. By doing this, the machine will run more efectively. By doing this, the machine will something something something."They are focusing on machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines. We are the masters. They are the slaves.

• Un lenguaje que nos tiene como prioridad!

Page 19: Introducción a RubyOnRails

Agenda

Ing. Pablo Marrero

• Introducción • Qué es Ruby On Rails?• Historia

• Pilares de RoR• Ruby• Convención sobre Configuración• DRY• Active Record (ORM)• Migrations

• A codificar!• Instalación de Ruby y RoR • Herramientas de desarrollo• Ejemplo “mini” proyecto

Page 20: Introducción a RubyOnRails

Pilares de RoRConvención sobre Configuración

Ing. Pablo Marrero

• Mayor parte de los frameworks Web (y no web) • Tedioso inicio de un proyecto • Gran cantidad de configuración

• Rails• Basado en el principio de CoC• Serie de convenciones a seguir

• Algunos tipos de datos, campos sugeridos (id, created at y updated at, etc.)

• Como se llaman las tablas y las clases, así como las tablas de relación (y que va en singular, que va en plural y como se determina como singularizar/pluralizar)

• Como se organizan los archivos en nuestro árbol

Page 21: Introducción a RubyOnRails

Pilares de RoRConvención sobre Configuración

Ing. Pablo Marrero

• Esto puede verse como una limitación, pero debe ser visto como una ayuda

• En la mayoría de los proyectos, lo primero que realiza el equipo de desarrollo es ponerse de acuerdo en la nomenclatura a utilizar

• Gracias al principio de CoC de rails, esta tarea se simplifica, y además si uno cambia de proyecto, no debe acostumbrarse a una nueva nomenclatura

• Por último, si no deseamos seguir alguna de las convenciones utilizadas por Rails, siempre es posible hacerlo explicitándolo

Page 22: Introducción a RubyOnRails

Agenda

Ing. Pablo Marrero

• Introducción • Qué es Ruby On Rails?• Historia

• Pilares de RoR• Ruby• Convención sobre Configuración• DRY• Active Record (ORM)• Migrations

• A codificar!• Instalación de Ruby y RoR • Herramientas de desarrollo• Ejemplo “mini” proyecto

Page 23: Introducción a RubyOnRails

Pilares de RoRDont Repeat Yourself

Ing. Pablo Marrero

• El código repetido no solo es una perdida de tiempo una vez, sino que muchas

• Dar mantenimiento a pedazos repetidos de código es cada vez mas pesado

• Requiere que todos los desarrolladores del proyecto conozcan todos los detalles del proyecto para no romperlo al reimplementar alguna parte

• Si una determinada porción de código esta repetida, si cambia debo buscar en todo el proyecto y modificarla, con la consecuente posibilidad de introducción de errores, etc.

Page 24: Introducción a RubyOnRails

Pilares de RoRDont Repeat Yourself

Ing. Pablo Marrero

• DRY• Separar nuestro código en bibliotecas, o utilizar helpers en las diferentes partes del código, nos permite aplicarlo en diferentes proyectos

• Con la ayuda de estas bibliotecas y helpers la programación se hace mas clara y sencilla

• Como consecuencia de este principio

Menos Código => Menos posibilidad de Error

Page 25: Introducción a RubyOnRails

Agenda

Ing. Pablo Marrero

• Introducción • Qué es Ruby On Rails?• Historia

• Pilares de RoR• Ruby• Convención sobre Configuración• DRY• Active Record (ORM)• Migrations

• A codificar!• Instalación de Ruby y RoR • Herramientas de desarrollo• Ejemplo “mini” proyecto

Page 26: Introducción a RubyOnRails

Pilares de RoRActive Record

Ing. Pablo Marrero

• Se trata de un patrón de diseño• Propuesto por Martin Fowler• Cuyo cometido es encapsular el acceso a BD• Mapeando tablas a clases y tuplas a objetos

• El Patrón Active Record• Realiza el mapeo directo• Simple, no maneja relaciones entre objetos• Simplemente un método find y getters/setters

Page 27: Introducción a RubyOnRails

Pilares de RoRActive Record

Ing. Pablo Marrero

•La librería de Rails• Basado en el principio DRY

• Utiliza convenciones (nombre de clase es el singular del nombre de la tabla)

• Brinda validadores (validates_presence_of, etc)

• Filtros before y after (before_update, after_delete, etc)

• Agnóstico en cuanto a BD a utilizar

• Relaciones entre objetos (has_many, belongs_to, etc)

Page 28: Introducción a RubyOnRails

Pilares de RoRActive Record

Ing. Pablo Marrero

• Ejemplos• Para realizar el mapeo en Rails hacemos que nuestra clase herede de ActiveRecord::Base

class Order < ActiveRecord::Baseend

• Con esta declaración ya tengo acceso a la tabla Orders que mencionamos antes, con lo cual ya puedo hacer…

order = Order.find(1)put order.number “ - ” order.description>> 1 - descripcion

Page 29: Introducción a RubyOnRails

Pilares de RoRActive Record

Ing. Pablo Marrero

• Los métodos find

Order.find(23)Order.find(:first)Order.find(:all, :offset => 10, :limit => 10)Order.find_by_description(“order1”)

• Find con condiciones• En el símbolo conditions se puede colocar cualquier sentencia sqlOrder.find(:all, :conditions => [‘description = ?’, ‘desc1’])• Sql ejecutadaSelect * from orders where description = “desc1”;

Page 30: Introducción a RubyOnRails

Pilares de RoRActive Record

Ing. Pablo Marrero

• Find con orden• En el símbolo order se puede colocar cualquier sentencia sqlOrder.find(:all, :order => ‘description’)• Sql ejecutadaSelect * from orders order by description;

• Otros Find•find_by_attr

• Métodos “comodin”, en attr podemos colocar cualquier atributo de nuestro modelo

Order.find_by_description(‘desc1’);• Incluso concatenarlosOrder.find_by_description_and_number(‘desc1’,1);

Page 31: Introducción a RubyOnRails

Pilares de RoRActive Record

Ing. Pablo Marrero

• Relaciones• Para expresar relaciones One to One

• Utilizar has_one en el modelo base y belongs_to en el modelo asociadoclass Employee < ActiveRecord::Base

has_one :office //Cuando la fk esta en la

// otra tablaendclass Office < ActiveRecord::Base

belongs_to :employee //fk aquí (employee_id)end

>> joe_employee = Employee.find_by_first_name('joe')SELECT * FROM employees WHERE (employees.`first_name` = 'joe') LIMIT 1

>> joes_office = joe_employee.officeSELECT * FROM offices WHERE (offices.employee_id = 1) LIMIT 1>> joes_office.employeeSELECT * FROM employees WHERE (employees.`id` = 1)

Page 32: Introducción a RubyOnRails

Pilares de RoRActive Record

Ing. Pablo Marrero

•Para expresar relaciones One to Many• Utilizar has_many en el modelo base y belongs_to

en el modelo asociadoclass Employee < ActiveRecord::Base

belongs_to :manager //fk va aquí (manager_id)endclass Manager < ActiveRecord::Base

has_many :employeesend

Page 33: Introducción a RubyOnRails

Pilares de RoRActive Record

Ing. Pablo Marrero

•Para expresar relaciones Many to Many• Utilizar has_many en los modelos base y

belongs_to en el modelo de relacionclass Appearance < ActiveRecord::Base

belongs_to :dancerbelongs_to :movie

endclass Dancer < ActiveRecord::Base

has_many :appearances, :dependent => true

has_many :movies, :through => :appearancesendclass Movie < ActiveRecord::Base

has_many :appearances, :dependent => true

has_many :dancers, :through => :appearancesend

Page 34: Introducción a RubyOnRails

Pilares de RoRActive Record

Ing. Pablo Marrero

• Validaciones• Contamos con un juego de validaciones extenso, listo para su uso• Algunos ejemplos

class User < ActiveRecord::Basevalidates_confirmation_of :login, :passwordvalidates_confirmation_of :email,

:message => "should match confirmation"validates_format_of :email,

:with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,

:on => :createend

Page 35: Introducción a RubyOnRails

Pilares de RoRActive Record

Ing. Pablo Marrero

• Filtros before y after• AR nos brinda un conjunto de filtros que podemos utilizar para ejecutar acciones ante algún acontecimiento• Por ejemplo

class Subscription < ActiveRecord::Basebefore_create :record_signupprivatedef record_signup

self.signed_up_on = Date.todayend

end

Page 36: Introducción a RubyOnRails

Pilares de RoRActive Record

Ing. Pablo Marrero

• Filtros before y after• Orden de ejecución de los filtros

* (-) save* (-) valid?* (1) before_validation* (2) before_validation_on_create* (-) validate* (-) validate_on_create* (3) after_validation* (4) after_validation_on_create* (5) before_save* (6) before_create* (-) create* (7) after_create* (8) after_save

Page 37: Introducción a RubyOnRails

Agenda

Ing. Pablo Marrero

• Introducción • Qué es Ruby On Rails?• Historia

• Pilares de RoR• Ruby• Convención sobre Configuración• DRY• Active Record (ORM)• Migrations

• A codificar!• Instalación de Ruby y RoR • Herramientas de desarrollo• Ejemplo “mini” proyecto

Page 38: Introducción a RubyOnRails

Pilares de RoRMigrations

Ing. Pablo Marrero

• Una de las principales fuentes de problemas en muchos proyectos es que los programadores pueden ser excelentes en un lenguaje y no tanto en otro...

• Los ORMs como Hibernate, esconden el SQL, presentándonos una interfaz directa en nuestro lenguaje de aplicación... Pero no resuelven como crear la estructura de datos

• Rails incluye el concepto de migraciones, que nos permiten definir o modificar la estructura de nuestra BD desde Ruby, y además, hacerlo de manera independiente del motor de BD que elijamos

Page 39: Introducción a RubyOnRails

Pilares de RoRMigrations

Ing. Pablo Marrero

• Las migraciones nos permiten además manejar versiones de todo el entorno de nuestra aplicación, simplificándonos en gran medida el despliegue a servidores de producción

• Se van numerando en orden secuencial las migraciones y en la base se almacena el nro de versión actual (hasta versiones anteriores a 2.1)

• En 2.1 las migrations se numeran con un timestamp en UTC y se lleva un registro de cada ejecución• Este comportamiento es para contemplar equipos de desarrollo, y que las migrations de cada uno no se sobrescriban

Page 40: Introducción a RubyOnRails

Pilares de RoRMigrations

Ing. Pablo Marrero

• Este manejo nos brinda la posibilidad de volver a una determinada versión de la base de datos, etc…,

• Rails brinda una serie de generadores entre los cuales se encuentra el generador de migrations

Page 41: Introducción a RubyOnRails

Pilares de RoRMigrations

Ing. Pablo Marrero

• Ejemplos•Generando una migración para la tabla Products

ruby script/generate migration create_table_product

class CreateTableProduct < ActiveRecord::Migration def self.up end

def self.down endend

Page 42: Introducción a RubyOnRails

Pilares de RoRMigrations

Ing. Pablo Marrero

• Creamos la tabla

ruby script/generate migration create_table_orders

class CreateTableOrders < ActiveRecord::Migration def self.up

create_table :orders do |t| t.integer :number t.string :description t.timestamps end

end def self.down

drop_table :orders endend

Page 43: Introducción a RubyOnRails

Pilares de RoRMigrations

Ing. Pablo Marrero

• Algunos modificadores a tener en cuenta• :limit

• Indica el tamaño máximo del campo• :precision

• Indica la precisión del campo si se trata de un number

• :null• Indica si acepta nulos o no

• :default• Indica el valor por defecto para el campo

Page 44: Introducción a RubyOnRails

Pilares de RoRMigrations

Ing. Pablo Marrero

• Algunos “metodos” a tener en cuenta• create_table, drop_table

• Crea/Elimina una tabla en la BD• change_column

• Modifica una columna de una tabla, por ejemplo para modificar la columna order_type de la tabla orderschange_column :orders, :order_type, :string

• rename_table• Renombra una determinada tabla en la BD

• add_index, remove_index• Crea/Elimina un índice de una tabla en la BD

Page 45: Introducción a RubyOnRails

Agenda

Ing. Pablo Marrero

• Introducción • Qué es Ruby On Rails?• Historia

• Pilares de RoR• Ruby• Convención sobre Configuración• DRY• Active Record (ORM)• Migrations

• A codificar!• Instalación de Ruby y RoR • Herramientas de desarrollo• Ejemplo “mini” proyecto

Page 46: Introducción a RubyOnRails

A Codificar!Instalación de Ruby y RoR

Ing. Pablo Marrero

• Para tener un ambiente en que podamos desarrollar en RoR, debemos seguir los siguientes pasos

• Instalación de Ruby• Dependiendo del Sistema Operativo

• Si estoy en Windows, existe un instalador el cual nos instala Ruby y además Gems

• Si estoy en *nix dos opciones• Bajar y compilar ruby siguiendo las

instrucciones• Instalar los paquetes correspondientes a

cada distro• En el sitio de Ruby existen guias claras para la

instalacion en cada uno de los sistemas operativos

Page 47: Introducción a RubyOnRails

A Codificar!Instalación de Ruby y RoR

Ing. Pablo Marrero

•Instalación de Gems• Gems es el gestionador de paquetes de ruby,

análogo al apt-get de debian• Si estoy en Windows me quedo instalado en el paso

anterior• De lo contrario bajarlo e instalarlo

Page 48: Introducción a RubyOnRails

A Codificar!Instalación de Ruby y RoR

Ing. Pablo Marrero

• Ahora debemos instalar RoR• Utilizando gems en una consola ejecutamos

gem install rails

• Con esto queda instalado RoR

• Por ultimo debemos contar con una Base de Datos para trabajar con nuestros nuevos proyectos

• Como nombramos antes RoR es agnóstico en cuanto a la BD por lo que podemos instalar cualquiera (Mysql, Postgresql, Oracle, DB2, etc)• Para los ejemplos vamos a utilizar Mysql

Page 49: Introducción a RubyOnRails

Agenda

Ing. Pablo Marrero

• Introducción • Qué es Ruby On Rails?• Historia

• Pilares de RoR• Ruby• Convención sobre Configuración• DRY• Active Record (ORM)• Migrations

• A codificar!• Instalación de Ruby y RoR • Herramientas de desarrollo• Ejemplo “mini” proyecto

Page 50: Introducción a RubyOnRails

A Codificar!Herramientas de Desarrollo

Ing. Pablo Marrero

• Básicamente para trabajar con RoR se necesitan• Un editor de texto• Una consola para ejecutar comandos (rake, ruby, etc)• Un browser para ir ejecutando la aplicación

• Pero los que venimos de Java queremos un IDE!• Para nosotros tenemos la opción de

• NetBeans 6.1• Tiene soporte para RoR con “todo” lo que

estamos acostumbrados a utilizar en Java• RadRails (http://www.aptana.com/rails/)

• IDE basado en eclipse

Page 51: Introducción a RubyOnRails

Agenda

Ing. Pablo Marrero

• Introducción • Qué es Ruby On Rails?• Historia

• Pilares de RoR• Ruby• Convención sobre Configuración• DRY• Active Record (ORM)• Migrations

• A codificar!• Instalación de Ruby y RoR • Herramientas de desarrollo• Ejemplo “mini” proyecto

Page 52: Introducción a RubyOnRails

A Codificar!Mini Proyecto

Ing. Pablo Marrero

DEMO

Page 53: Introducción a RubyOnRails

Recursos Web

Ing. Pablo Marrero

• Sitio de Ruby• http://www.ruby-lang.org/es/

• Sitio de RoR• http://www.rubyonrails.org/

• Noticias de Ruby• http://www.rubyinside.com/

• Noticias de RoR• http://www.railsinside.com/

• Grupo de Usuarios Ruby del Uruguay• http://www.ruguy.org/

Page 54: Introducción a RubyOnRails

Libros

Ing. Pablo Marrero

• Agile Web Development With Rails

• Programming Ruby

Page 55: Introducción a RubyOnRails

¿ Preguntas ?

Ing. Pablo Marrero

Page 56: Introducción a RubyOnRails

Referencias

Ing. Pablo Marrero

• Charla Introducción a Ruby• Dictada por Diego Algorta Casamayou• http://www.archive.org/details/20060913_ruby_en_15_minutos• www.oboxodo.com

• Charla Introduction to Active Record• Dictada por Evan ‘Rabble’ Henshaw-Plath• http://www.slideshare.net/rabble/introduction-to-active-record-silicon-valley-ruby-conference-20007

Page 57: Introducción a RubyOnRails

Muchas Gracias!

Ing. Pablo Marrero

Ing. Pablo Marrero [email protected]