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 Modelo Vista Controlador Browser 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 RoR Ruby 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 RoR Ruby 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 8 5.+(3)  // idem anterior Los operadores base del lenguaje también son métodos y por lo tanto los podemos sobrescribir class Fixnum def +(other) >> 5 + 3 self – other => 2 end end
Pilares de RoR Ruby 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 RoR Ruby 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 RoR Ruby Ing. Pablo Marrero Las estructuras  devuelven  el valor de la ultima expresión evaluada: @user = if params[:id] User.find(params[:id]) else User.new end
Pilares de RoR Ruby Ing. Pablo Marrero @post = Post.find(params[:id]) if @post @post.destroy end Mejor: if @post = Post.find(params[:id]) @post.destroy end
Pilares de RoR Ruby Ing. Pablo Marrero Asignaciones condicionales @title = "Tıtulo generico" unless defined?(@title) @title ||= "Tıtulo generico“ @heading = if defined?(@subsection) @subsection.title else @section.title end @heading = ( @subsection || @section ).title
Pilares de RoR Ruby 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 @arr puts item end
Pilares de RoR Ruby 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 RoR Ruby Ing. Pablo Marrero Que pasa con las clases? class Persona def nombre @nombre end def nombre=(nombre) @nombre = nombre end end No mas getter y setter!! class Persona attr_accesor :nombre, :apellido attr_reader :id attr_writer :notas end
Pilares de RoR Ruby Ing. Pablo Marrero En resumen Ruby es un lenguaje Dinámico Orientado a objetos puro Fácil de programar! Según su creador Yukihiro Matsumoto Often 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 RoR Convenció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 RoR Convenció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 RoR Dont 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 RoR Dont 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 RoR Active 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 RoR Active 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 RoR Active Record Ing. Pablo Marrero Ejemplos Para realizar el mapeo en Rails hacemos que nuestra clase herede de ActiveRecord::Base class Order < ActiveRecord::Base end 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 RoR Active 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 sql Order.find(:all, :conditions => [‘description = ?’, ‘desc1’]) Sql ejecutada Select * from orders where description = “desc1”;
Pilares de RoR Active Record Ing. Pablo Marrero Find con orden En el símbolo order se puede colocar cualquier sentencia sql Order.find(:all, :order => ‘description’) Sql ejecutada Select * 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 concatenarlos Order.find_by_description_and_number(‘desc1’,1);
Pilares de RoR Active Record Ing. Pablo Marrero Relaciones Para expresar relaciones One to One Utilizar has_one en el modelo base y belongs_to en el modelo asociado class Employee < ActiveRecord::Base has_one :office //Cuando la fk esta en la    // otra tabla end class 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.office SELECT * FROM offices WHERE (offices.employee_id = 1) LIMIT 1 >> joes_office.employee SELECT * FROM employees WHERE (employees.`id` = 1)
Pilares de RoR Active Record Ing. Pablo Marrero Para expresar relaciones One to Many Utilizar has_many en el modelo base y belongs_to en el modelo asociado class Employee < ActiveRecord::Base belongs_to :manager //fk va aquí (manager_id) end class Manager < ActiveRecord::Base has_many :employees end
Pilares de RoR Active Record Ing. Pablo Marrero Para expresar relaciones Many to Many Utilizar has_many en los modelos base y belongs_to en el modelo de relacion class Appearance < ActiveRecord::Base belongs_to :dancer belongs_to :movie end class Dancer < ActiveRecord::Base has_many :appearances, :dependent => true has_many :movies, :through => :appearances end class Movie < ActiveRecord::Base has_many :appearances, :dependent => true has_many :dancers, :through => :appearances end
Pilares de RoR Active Record Ing. Pablo Marrero Validaciones Contamos con un juego de validaciones extenso, listo para su uso Algunos ejemplos class User < ActiveRecord::Base validates_confirmation_of :login, :password validates_confirmation_of :email, :message => &quot;should match confirmation&quot; validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create end
Pilares de RoR Active 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::Base before_create :record_signup private def record_signup self.signed_up_on = Date.today end end
Pilares de RoR Active 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 RoR Migrations 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 RoR Migrations 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 RoR Migrations 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 RoR Migrations 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 end end
Pilares de RoR Migrations 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 end end
Pilares de RoR Migrations 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 RoR Migrations 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 orders change_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
Muchas Gracias! Ing. Pablo Marrero Ing. Pablo Marrero [email_address]

Introducción a RubyOnRails

  • 1.
    Introducción a Ruby On Rails Ing. Pablo Marrero
  • 2.
    Agenda Ing. PabloMarrero 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
  • 3.
    Introducción Ing. PabloMarrero 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
  • 4.
    Introducción Ing. PabloMarrero 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
  • 5.
    Introducción Ing. PabloMarrero 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 Modelo Vista Controlador Browser BD
  • 6.
    Introducción Ing. PabloMarrero 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
  • 7.
    Agenda Ing. PabloMarrero 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
  • 8.
    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
  • 9.
    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 8 5.+(3) // idem anterior Los operadores base del lenguaje también son métodos y por lo tanto los podemos sobrescribir class Fixnum def +(other) >> 5 + 3 self – other => 2 end end
  • 10.
    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
  • 11.
    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?
  • 12.
    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]) else User.new end
  • 13.
    Pilares de RoRRuby Ing. Pablo Marrero @post = Post.find(params[:id]) if @post @post.destroy end Mejor: if @post = Post.find(params[:id]) @post.destroy end
  • 14.
    Pilares de RoRRuby Ing. Pablo Marrero Asignaciones condicionales @title = &quot;Tıtulo generico&quot; unless defined?(@title) @title ||= &quot;Tıtulo generico“ @heading = if defined?(@subsection) @subsection.title else @section.title end @heading = ( @subsection || @section ).title
  • 15.
    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 @arr puts item end
  • 16.
    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 } >> []
  • 17.
    Pilares de RoRRuby Ing. Pablo Marrero Que pasa con las clases? class Persona def nombre @nombre end def nombre=(nombre) @nombre = nombre end end No mas getter y setter!! class Persona attr_accesor :nombre, :apellido attr_reader :id attr_writer :notas end
  • 18.
    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 Matsumoto Often people, especially computer engineers, focus on the machines. They think, &quot;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.&quot;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!
  • 19.
    Agenda Ing. PabloMarrero 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
  • 20.
    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
  • 21.
    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
  • 22.
    Agenda Ing. PabloMarrero 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
  • 23.
    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.
  • 24.
    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
  • 25.
    Agenda Ing. PabloMarrero 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
  • 26.
    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
  • 27.
    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)
  • 28.
    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::Base end 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
  • 29.
    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 sql Order.find(:all, :conditions => [‘description = ?’, ‘desc1’]) Sql ejecutada Select * from orders where description = “desc1”;
  • 30.
    Pilares de RoRActive Record Ing. Pablo Marrero Find con orden En el símbolo order se puede colocar cualquier sentencia sql Order.find(:all, :order => ‘description’) Sql ejecutada Select * 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 concatenarlos Order.find_by_description_and_number(‘desc1’,1);
  • 31.
    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 asociado class Employee < ActiveRecord::Base has_one :office //Cuando la fk esta en la // otra tabla end class 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.office SELECT * FROM offices WHERE (offices.employee_id = 1) LIMIT 1 >> joes_office.employee SELECT * FROM employees WHERE (employees.`id` = 1)
  • 32.
    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 asociado class Employee < ActiveRecord::Base belongs_to :manager //fk va aquí (manager_id) end class Manager < ActiveRecord::Base has_many :employees end
  • 33.
    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 relacion class Appearance < ActiveRecord::Base belongs_to :dancer belongs_to :movie end class Dancer < ActiveRecord::Base has_many :appearances, :dependent => true has_many :movies, :through => :appearances end class Movie < ActiveRecord::Base has_many :appearances, :dependent => true has_many :dancers, :through => :appearances end
  • 34.
    Pilares de RoRActive Record Ing. Pablo Marrero Validaciones Contamos con un juego de validaciones extenso, listo para su uso Algunos ejemplos class User < ActiveRecord::Base validates_confirmation_of :login, :password validates_confirmation_of :email, :message => &quot;should match confirmation&quot; validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create end
  • 35.
    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::Base before_create :record_signup private def record_signup self.signed_up_on = Date.today end end
  • 36.
    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
  • 37.
    Agenda Ing. PabloMarrero 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
  • 38.
    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
  • 39.
    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
  • 40.
    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
  • 41.
    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 end end
  • 42.
    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 end end
  • 43.
    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
  • 44.
    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 orders change_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
  • 45.
    Agenda Ing. PabloMarrero 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
  • 46.
    A Codificar! Instalaciónde 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
  • 47.
    A Codificar! Instalaciónde 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
  • 48.
    A Codificar! Instalaciónde 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
  • 49.
    Agenda Ing. PabloMarrero 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
  • 50.
    A Codificar! Herramientasde 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
  • 51.
    Agenda Ing. PabloMarrero 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
  • 52.
    A Codificar! MiniProyecto Ing. Pablo Marrero DEMO
  • 53.
    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/
  • 54.
    Libros Ing. PabloMarrero Agile Web Development With Rails Programming Ruby
  • 55.
    ¿ Preguntas ?Ing. Pablo Marrero
  • 56.
    Referencias Ing. PabloMarrero 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
  • 57.
    Muchas Gracias! Ing.Pablo Marrero Ing. Pablo Marrero [email_address]