Aprendiendo Ruby y Rails

En esta ocasión se hablará del framework Ruby on Rails. Recomendamos al lector revisar la siguiente referencia para que realice la instalación adecuada a su plataforma favorita: rubyonrails.org. También, es importante señalar que se requiere de un RDBMS instalado, en este caso se utilizó MySQL, por lo tanto, la sintaxis referente a la Base de Datos es propia de esta última. Los comandos que se indican toman como base el ambiente Windows; para Linux se sugiere observar el cambio de sintaxis en las líneas de comandos correspondientes y el web server a utilizar es WEBrick.

Arquitectura de Rails Como ya se mencionó, Rails es un framework para desarrollo web con base en el patrón arquitectónico MVC 2, es decir, la capa del frente (presentación) es totalmente independiente de la capa de lógica de negocio, la cual es representada por un controlador que manipula al modelo (capa de datos). Los elementos arquitectónicos más importantes de una aplicación Rails se presentan en el siguiente esquema:

La arquitectura funciona de la siguiente manera: se genera una petición desde el navegador, el web server al recibirla la redirecciona a un recurso específico a traves de la librería CGI, posteriormente, éste manda la petición a un controlador que vive dentro de la capa de ActionPack; el controlador por su parte no conoce a la capa de presentación, definida por las vistas/Action View, sin embargo puede manipular y administrar los objetos de negocio, los cuales a su vez son representados por objetos que derivan de la clase Active Record, que es la capa que une los datos contenidos en el RDBMS.

Una vez que dichos objetos de negocio son manipulados por el controlador, pueden ser compartidos de manera automática con las vistas. ERb es un paquete que permite la manipulación de código Ruby intercalado con HTML, de tal manera que aun cuando las vistas contienen código híbrido (HTML y Ruby), ERb toma dicha combinación, interpreta los resultados y valores del lenguaje generando al final sólo HTML, así, éste puede ser reenviado por el web server para su interpretación limpia dentro del browser.

Arrancando con Rails
El procedimiento que se describire a continuación es el proceso simple recomendado para la creación de cualquier aplicación basada en Rails:

1) Creación del modelo de datos. En esta etapa se generan las bases de datos de desarrollo, prueba y producción, adicionalmente se crean los objetos de negocio que representan al dominio que estemos tratando.
2) Creación de la lógica de negocio. Aquí se desarrolla toda la lógica de negocio de la aplicación.
3) Creación de la presentación. En esta etapa se generarán todos los elementos que permitirán interactuar al usuario con el sistema.

Es posible que uno pueda preguntarse que, no necesariamente todos los actores de un sistema son humanos. En este caso Ruby y Rails proporcionan una gran variedad de recursos y librerías que permiten interactuar con otros elementos externos, tales como el correo electrónico o el uso de web services. La forma de cómo se puede interactuar con este tipo de elementos queda fuera del alcance de este artículo.

Asumiendo que Rails y el manejador relacional se han instalado correctamente, iniciaremos la generación del modelo creando las bases de datos correpondientes, siguiendo las convenciones que los diseñadores de Rails pensaron al contemplar un ciclo de vida de desarrollo completo (desarrollo, pruebas, distribución). Crearemos tres bases de datos con características y nombres similares que permitirán realizar cada una de estas fases.

Pasos
1. Definimos un directorio de desarrollo llamado trabajo, dentro de él creamos la aplicación base en Rails (en nuestro caso la denominaremos railsass):
>cd trabajo
>rails railsass

Al ejecutar este comando se crea la infraestructura base de la aplicación, que es la estándar para cualquier aplicación formada de la siguiente manera:

2. Se crean en MySQL 3 bases de datos:

railsass_development, railsass_test y railsass_deployment

3 - Una vez creadas las bases, se genera el modelo en Rails. En una sesión de consola Ruby, nos cambiamos al directorio recien creado railsass e invocamos el generador de modelos estándar utilizando como nombre del modelo Usuario:

path/trabajo>cd railsass
path/trabajo/railsass>ruby script/generate model Usuario

 

Una vez creado el modelo es necesario realizar su integración con la infrastructura de la base de datos. Para ello, Rails proporciona un mecanismo que permite definir las conexiones para dar persitencia a los objetos del modelo. Este mecanismo es un archivo de tipo YAML denominado database.yml, que reside en el subdirectorio config dentro del directorio railsass.

4. Editamos el archivo database.yml e incorporamos los parámetros del nombre host, los nombres de las bases de datos, los usuarios y los passwords de acceso. Para nuestro caso emplearemos los siguientes:

development:
adapter: mysql
database: railsass_development
username: root
password:
host: localhost


test:
adapter: mysql
database: railsass_test
username: root
password:
host: localhost


production:
adapter: mysql
database: railsass_production
username: root
password:
host: localhost

 

5. El acoplamiento entre los objetos de negocio y la base de datos se realiza a través de una migración, la cual se realiza por medio de un archivo con código Ruby (extensión .rb) que se encuentra localizado dentro del subdirectorio db/migrate. Típicamente el nombre de este archivo sigue la convención:

Así entonces el nombre del archivo de migración es 001_create_usuarios.rb

Como este archivo contiene la sintaxis de Ruby que describe la estructura de la tabla asociada al modelo en la base de datos, permite manipular código SQL a través de Ruby, resultando más cómodo, sencillo y elegante. Adicionalmente una migración permite modificar la estructura de las tablas conforme evolucione el desarrollo, de ahí el número de versión como parte del nombre del archivo.

Al inspeccionar 001_create_usuarios.rb podemos corroborar que contiene la definición de una clase que sigue la siguiente convención:

class Create

Normalmente esta clase posee 2 metodos: self.up y self.down. El objetivo de self.up es realizar las acciones correspondientes al ejecutar la migración. Por su parte self.down es un método pensado para realizar ajustes de reversa, es decir, deshacer acciones sobre la tabla en cuestión, en caso de tener que regresar a esa versión en particular.

Editamos 001_create_usuarios.rb asegurando que tenga las siguientes definiciones:

class CreateUsuarios < ActiveRecord::Migration
    def self.up
        create_table :usuarios do |t|
        t.column :nombre, :string
        t.column :apellido, :string
        t.column :tipo, :integer
        t.column :permisos, :string
    end
end


def self.down
     drop_table :usuarios
     end
end

6. Ejecutamos la migración a través del manejador de tareas rake:

cd path/trabajo/railsass
path/trabajo/railsass>rake db:migrate


Como parte de la comprobación del correcto funcionamiento de la migración, generaremos un objeto de negocio de tipo Usuario, calificando sus atributos, y guardando todo el objeto en la base de datos. Esto lo realizaremos a través de una consola interactiva irb Ruby y el propio manejador MySQL.

7. Arranquemos la consola interactiva irb Ruby para cargar el ambiente y la base de datos en memoria:

path/trabajo/railsass>ruby script/console


8. Creamos un objeto Usuario y cambiamos el valor a sus atributos (a continuación la sesión correspondiente).

>> tipo_usuario = 0
=> 0
>>tipo_admin = 1
=> 1
>>tipo_auditor = 2
=> 2
>>unUsuario = Usuario.new
=> #nil, “apellido”=>nil, “nombre”=> nil, “tipo”=>nil}, @new_record=true>
>>unUsuario.nombre = “David”
=> “David”
>>unUsuario.apellido = “HeineMeier”
=> “HeineMeier”
>>unUsuario.tipo = tipo_admin
=> 1
>>unUsuario.permisos = “rwx rwx rwx”
=> “rwx rwx rwx”
>>unUsuario.save
=>true


9. Podemos corroborar a través de MySQL que después del último comando, el objeto unUsuario ha quedado registrado en la base.

En este artículo exponemos brevemente la arquitectura general de Rails, además de explicar cómo generar el modelo de negocios aplicando el concepto de migraciones. En la próxima de nuestras entregas terminaremos el tutorial con el uso de controladores y vistas.

Referencias
[ Thomas David, Fowler Chad, Hunt Andy. “Programming Ruby” 2nd Edition. The Pragmatic Bookshelf. 2005. ]
[ Thomas David, Heinemeier Hanson David, et al. “Agile Web Development with Rails”. 2nd Edition. The Pragmatic Bookshelf, 2006. ]
[ Black, David A. “Ruby for Rails”. Manning Publications Co. 2006 ]
[ ruby-lang.org/en ]
[ rubyonrails.org ]
[ mysql.com ]

Acerca del autor.
Carlos Ortega es consultor en metodologías y prácticas ágiles (XP, TDD, Refactoring, Pair Programming), cuenta con certificaciones en RUP, OOAD, UML, etcétera. Es Certified ATAM Evaluator y Certified Professional Software Architect ambos avalados por el SEI. Ha colaborado en numerosos proyectos para diversas organizaciones como Banco de México, Elektra, Banco Azteca, Fandelli, Oracle, IMSS, Heinson, Accenture, EDS. Actualmente colabora con Software Ágil, empresa dedicada al tutelaje e implementación de metodologías ágiles (SCRUM, XP, Crystal).