Introducción a Ruby On Rails Ing. Pablo Marrero
Jan 13, 2015
Introducción
a
Ruby On Rails
Ing. Pablo Marrero
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
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
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
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
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
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
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
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
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
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?
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
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
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
end
@heading = ( @subsection || @section ).title
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
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 } >> []
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
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!
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
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
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
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
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.
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
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
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
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)
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
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”;
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);
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
A Codificar!Mini Proyecto
Ing. Pablo Marrero
DEMO
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/
Libros
Ing. Pablo Marrero
• Agile Web Development With Rails
• Programming Ruby
¿ Preguntas ?
Ing. Pablo Marrero
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