Artículo publicado: "La Era de los Frameworks: Ruby On Rails"

El año pasado me puse en contacto con la editorial MP Ediciones de Argentina para estudiar la posibilidad de escribir un libro con ellos. Entre medio de varias conversaciones sobre el tema, me invitaron a escribir un artículo para su Revista .Code. El contenido, por ser la primera vez que se tocaba el tema en la revista, explica como iniciarse en Ruby On Rails, partiendo desde la instalación en cualquiera de las dos plataformas más populares: Windows y GNU/Linux.

Este artículo se publicó recientemente en el número 26 de este mes, que calculo estará llegando a Uruguay el mes que viene.

Como "gaje del oficio", es siempre de esperar que el editor de turno modifique el contenido del artículo del autor, tal vez intentando mejorar la redacción, suprimiendo partes redundantes, o tal vez, disminuyendo el tamaño por una cuestión de espacio en la revista.

Generalmente, y este caso no es la excepción, una vez que el trabajo es entregado por el autor al editor, el resto es responsabilidad del último, no comunicando sus acciones al primero (hecho que no comparto mucho).

Para que el mismo no se pierda en el tiempo ni la intención original del mismo (entre otras cosas, dejaron solo la parte que habla de Windows), y por que finalmente yo soy el autor ;-), voy a publicar a continuación la "versión original y completa" de mi artículo.

Parafraseando a la película animada "La Era del Hielo", lo titulé de la siguiente manera ;-)

------------------------------------------------

DESARROLLO WEB AGIL

La Era de los Frameworks: Ruby On Rails

Ruby on Rails es un framework de desarrollo web diseñado para aumentar extremadamente la productividad y que está empezando a causar furor entre los desarrolladores expertos.

Introducción

Aproximadamente desde el año ‘97 que me desempeño como consultor en proyectos relacionados con Software Libre, y con el correr de los años, la temática de los mismos se ha orientado progresivamente al ambiente web. Desde mis inicios me he decantado por PHP, pues era (en mi experiencia) la mejor alternativa disponible entre los lenguajes de desarrollo web.

Descarté opciones propietarias como ASP, y otras Open Source como Perl, principalmente porque PHP me ofrecía la mayor libertad al más bajo costo.

Hasta el día de hoy sigo pensando lo mismo; pero algo ha cambiado. Cada vez disponemos de menos tiempo para concretar nuestros proyectos, necesitamos dar más valor agregado a nuestros desarrollos y debemos adaptarnos más rápido a los cambios: lo que sucede es que nos están obligando a ser cada vez más productivos.

Si hace algunos años que trabajas en ambientes web y no tienes la filosofía de reaprovechar los avances de tu desarrollo de software en beneficio de los proyectos futuros, estarás siendo parte de la famosa “fábrica de ruedas”, es decir, estarás reinventando la rueda de forma constante sin aprovechar la experiencia adquirida con el pasar de los años.

De esta forma, será imposible ser “extremadamente productivo”.

¿Qué es Ruby On Rails?

Como no debemos tener miedo a lo nuevo, a los cambios, y debemos estar informados y lograr hacer juicios de valor apoyados en experiencias reales y no en meras suposiciones, es que me animé experimentar con otras alternativas.

“Ruby On Rails”, muchas veces abreviado como RoR, significa en castellano “Rubí Sobre Rieles” y por definición es un Framework Open Source para Desarrollo Rápido de Aplicaciones Web. Si somos estrictos con la definición, el nombre está compuesto por dos palabras clave: Ruby por un lado y Rails por otro. En realidad el framework se llama simplemente Rails y fue desarrollado enteramente con el lenguaje de programación Ruby. A pesar de que usas Rails, en algún momento necesitarás escribir código en el lenguaje Ruby. Por todas estas razones es que el nombre combina ambas cosas: Ruby On Rails

Está basado fuertemente en una estructura con persistencia de datos, pero lo que no nos debe preocupar es que las grandes bases de datos del Software Libre se encuentran disponibles: por ejemplo MySQL y PostgreSQL.

El creador, David Heinemeier Hansson (DHH), desarrolló este framework para cubrir las necesidades de desarrollo de un proyecto web. Este programador danés ha sido galardonado por haber desarrollado este framework con el título ”Best Hacker 2005” en el evento O´Reilly Open Source Awards, organizado por Google.

Según ha expresado en entrevistas, el origen se debe a que tenía dos ámbitos de experiencia cuando comenzó con RoR: PHP (rápido y sucio) y Java/J2EE (lento y limpio). El objetivo de ROR era conseguir unir lo mejor de ambos (rápido y limpio).

El lenguaje de programación Ruby

Vale decir que llegamos indirectamente al lenguaje. A pesar que la mayoría de las distribuciones GNU/Linux incluyen (entre muchos lenguajes) a Ruby, este es un lenguaje que hasta hace poco tiempo no era extremadamente popular si no fuera por el éxito del framework. El autor del lenguaje Ruby se llama Yukihiro Matsumoto, de origen Japonés, y es más conocido por el seudónimo de Matz.

Entre sus cualidades se encuentra que es totalmente Orientado a Objetos (más que otros lenguajes muy populares), de alto nivel, y sobre todo, “divertido de programar” (según las palabras de su autor).

Concepto base I: el patrón MVC

Los Patrones de Diseño evitan que reinventemos la rueda para resolver problemas ampliamente conocidos y resueltos innumerables veces, y a su vez, hasta nos sirven de modelo para hacer soluciones "reutilizables" y "extensibles" porque aplican las mejores prácticas del Diseño Orientado a Objetos.

Este framework se basa en un patrón de diseño muy conocido, el “Modelo, Vista, Controlador” (MVC). La idea del patrón es separar el problema en tres capas: el modelo, que representa la lógica del sistema, la vista, que se encarga de mostrar la información del modelo, y el controlador, encargado de tomar las acciones del usuario del sistema e interactuar con el modelo y con la vista.

Diagrama que describe el funcionamiento de RoR

Nuestro sistema quedará estructurado en tres capas independientes que tienen responsabilidades distintas y bien diferenciadas, logrando que nuestro sistema sea más fácil de desarrollar y mantener.

Concepto base II: el patrón ActiveRecord

En Ruby On Rails el Modelo del patrón MVC se implementa a través del mapeo del “objeto” con su correspondiente “tabla” en la base de datos.


Representación UML del patrón de diseño ActiveRecord

Este patrón resuelve el eterno problema de la comunicación entre modelos de datos distintos, entre el Relacional y el Orientado a Objetos.

¿Cómo se instala?

Existe mucha información en Internet, pero a veces peca de inexacta o se comete pequeños errores. Si no tenemos experiencia en RoR, es frustrante iniciarse con tanta dificultad extra.

Instalación en Windows (3 pasos)

El primer y mejor tutorial que existe hasta el momento para hacer una instalación es de O'Reilly: Rolling with Ruby on Rails ("Rodando con Rubí sobre Rieles"), pero solo contempla al sistema operativo Windows. Por esa razón vamos a hacer una explicación que abarque a ambas instalaciones, que a pesar de que son muy parecidas, tienen pequeños detalles a tener en cuenta.

Paso 1: Instalar Ruby

Primer paso, bajar el instalador de Ruby desde RubyForge.org.

El instalador ya incluye el Gems, la aplicación que permite instalar el framework Rails, y que usaremos en el paso siguiente.



Pantalla de instalación de Rubyinstaller con las aplicaciones que incluye por defecto

Paso 2: Instalar Rails

Si ya tienes instalado Gems, solo debes abrir una ventana que permita escribir comandos desde la línea. Presiona desde la barra de tareas:

Botón de Inicio-> Ejecutar -> y escribe “cmd”

Al presionar ENTER deberá ejecutar una consola DOS que nos permitirá digitar los comandos del instalador del framework. Deberemos posicionarnos primero en el directorio donde instalamos Ruby (realizado en el Paso 1):

cd c:\ruby\bin

C:\ruby\bin>gem install rails --remote --include-dependencies

Attempting remote installation of 'rails'

Updating Gem source index for: http://gems.rubyforge.org

Successfully installed rails-1.0.0

Successfully installed activesupport-1.2.5

Successfully installed activerecord-1.13.2

Successfully installed actionpack-1.11.2

Successfully installed actionmailer-1.1.5

Successfully installed actionwebservice-1.0.0

Installing RDoc documentation for activesupport-1.2.5...

Installing RDoc documentation for activerecord-1.13.2...

[Mensaje resumido]

Si no se agrega el último parámetro ("incluir dependencias") por cada software que falte va a preguntar si quieres instalarlo, lo que sucede casi en seis oportunidades.

Paso 3: Instalar MySQL

Al principio, no debemos complicarnos. Si lo que queremos es probar el entorno de desarrollo, cuando el instalador de MySQL nos pregunte por el usuario administrador digitaremos “root” y su clave “root”. Más adelante podremos asegurar todas estas configuraciones.

Windows Essentials (x86) 4.1

http://dev.mysql.com/downloads/mysql/4.1.html

Instalación en GNU/Linux (3 pasos)

En mi caso particular uso GNU/Linux y no Windows para desarrollar. La distribución que estoy usando actualmente es Fedora Core 4. Las distribuciones no son todas iguales, y siempre tienen sus peculiaridades. De todas formas, no debiera existir mayores problemas con las indicaciones que detallaremos a continuación. Si no cuentas con algunas de las herramientas que menciono y que simplifican la instalación, siempre está la alternativa de bajar los fuentes e instalarlos a mano.

Paso 1: Instalar Ruby

Si la instalación de la distribución no incluyó por defecto a Ruby, lo puedes hacer desde los CD's. También puedes usar un instalador en línea, para bajar las últimas versiones de los paquetes desde Internet.

El más famoso es el apt-get de Debian. En el caso de Fedora GNU/Linux disponemos de Yum.


Con Yum, todo es más sencillo:

yum install ruby

Si la instalación concluye sin errores, ya estás casi pronto para empezar a trabajar.


Paso 2: Instalar “Gem”, el “Instalador de Rails”

Rails cuenta con un propio instalador en línea que se llama Gem (vendría a ser el Yum de Fedora GNU/Linux, pero solo sirve para instalar Rails). Para poder instalar el framework hay que bajar primero el Gem y luego correrlo para que inicie la instalación. La dirección oficial es: http://docs.rubygems.org/shelf y en la sección de download deberás bajar la última versión.

Cuando dispongamos del archivo comprimido de extensión tgz, lo descomprimes en tu directorio preferido, o en el directorio estándar para estas tareas: /opt.

tar zxvf rubygems-0.8.11.tgz


Y para instalarlo, luego de entrar en el directorio generado, hay que ejecutar:

cd rubygems-0.8.11
ruby setup.rb


En todas la pruebas realizadas, la instalación no dio errores.

Paso 3: Instalar Rails

Ya estamos prontos para instalar Rails usando nuestro instalador Gem.
La sintaxis deberá ser:

gem install rails --remote --include-dependencies


Si no agregas el último parámetro ("incluir dependencias") por cada software que falte te va a preguntar si quieres instalarlo, lo que sucede casi en seis oportunidades.

En este caso, sí surgieron problemas.

gem install rails --remote --include-dependencies

Attempting remote installation of 'rails'
Successfully installed rails-1.0.0
Successfully installed activesupport-1.2.5
Successfully installed activerecord-1.13.2
/usr/lib/site_ruby/1.8/rubygems/custom_require.rb:21:in `require__': no such file to load -- rdoc/rdoc (LoadError)


Esto significa que el software rdoc no se encuentra instalado en el sistema. Para solucionarlo simplemente ejecuté el Yum:

yum install rdoc

Installing:
rdoc i386 1.8.4-1.fc4 updates-released 119 k
Installing for dependencies:
irb i386 1.8.4-1.fc4 updates-released 62 k

[Mensaje resumido]

Y de paso, me avisa que hay una "dependencia a cumplir" que es instalar el irb, lo cual acepté.

Volví a correr la instalación del Rails y esta continuó con éxito:

gem install rails --remote --include-dependencies

Attempting remote installation of 'rails'
Successfully installed rails-1.0.0


Probar la instalación de RoR (Windows/Linux)

En primera instancia, debemos tener disponible el comando "rails" desde nuestra consola. Para probarlo, nos posicionamos en un directorio que alojaremos nuestros proyectos web basados en RoR. En el caso de GNU/Linux, lo estándar es usar subdirectorios a partir del “directorio base” llamado /var/www. Si usamos Windows, podremos crear la misma estructura a partir del “directorio base” llamado c:\rails.

Nuestro primer proyecto

Deberemos posicionarlos en el “directorio base” correspondiente a nuestro sistema, ejecutar el comando "rails" y el nombre del proyecto que deseamos crear. La idea es que el framework cree un subdirectorio con el nombre que le ingresamos, y luego él armará toda una serie de subdirectorios y archivos que corresponderán a la estructura inicial para poder comenzar a trabajar en nuestro proyecto RoR:

rails miproyecto


Esto producirá la siguiente salida por pantalla:

create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create components
create db
create doc
create lib
create lib/tasks
create log
create public/images
[Mensaje resumido]

Entramos en el directorio de nuestra aplicación y ejecutamos un mini servidor web para probar que nuestro entorno RoR esté respondiendo:

cd miproyecto
ruby script/server


El último comando ejecuta el servidor, y la salida en consola es la siguiente:

=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2006-01-23 16:45:54] INFO WEBrick 1.3.1
[2006-01-23 16:45:54] INFO ruby 1.8.4 (2005-12-24) [i386-linux]
[2006-01-23 16:45:54] INFO WEBrick::HTTPServer#start: pid=7627 port=3000


Nuestro servidor atenderá el puerto 3000. Si usamos nuestro navegador y apuntamos a la dirección http://localhost:3000 (localhost representa nuestro "servidor local"), nos deberá responder un mensaje de bienvenida:


Pantalla de bienvenida que nos devuelve el servidor WEBrick, confirmando que todo fue instalado y configurado correctamente.

¡Felicitaciones! ¡El primer paso está dado!

Nuestra primer aplicación útil

Para poder hacer una prueba del nuestro entorno “veloz” de desarrollo, que mejor que hacer “esa” actividad que se repite una y otra vez en nuestros sistemas, y que el framework ya tiene sumamente resuelta: nuestro primer ABM (Altas, Bajas y Modificaciones).

Debemos crear nuestra primera base de datos y nuestra primera tabla. Ejecutaremos nuestro cliente de turno para trabajar con MySQL (existen muchos, pero puedes bajar los oficiales desde http://www.mysql.com/products/tools/), y crearemos la base de datos “miproyecto” y la tabla “cliente” con la siguiente estructura:

CREATE TABLE `miproyecto`.`clientes` (

`id` int(3) NOT NULL auto_increment,

`nombre` varchar(45) default NULL,

`telefono` varchar(45) default NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Y deberemos definir cual es nuestra configuración de nuestra base de datos editando el siguiente archivo:

En Windows: C:\rails\miproyecto\config\database.yml

En GNU/Linux: /var/www/miproyecto/config/database.yml

Nota: en GNU/Linux la única diferencia con los directorios de Windows es el sentido de la barra (“\” por “/”) y la ausencia de la representación de unidades a través de letras.

A continuación, deberemos modificar el nombre de la base, agregar la clave del usuario y comentar la línea “socket”:

development:

adapter: mysql

database: miproyecto

username: root

password: root

#socket: /path/to/your/mysql.sock

Si queremos ir rápido y seguro, podemos usar los “andamios” (scaffolding)

Scaffold es un veloz generador de CRUD: Create, Retrive, Update y Delete, lo que significaría en castellano: un ABM.

Posicionados en el directorio base de nuestro proyecto ejecutaremos el comando para generar el modelo:

C:\rails>cd miproyecto

C:\rails\miproyecto>ruby script\generate scaffold Cliente

exists app/controllers/

exists app/helpers/

exists app/views/clientes

exists test/functional/

dependency model

exists app/models/

exists test/unit/

exists test/fixtures/

create app/models/cliente.rb

create test/unit/cliente_test.rb

create test/fixtures/clientes.yml

create app/views/clientes/_form.rhtml

[Mensaje resumido]

Nota: si al efectuar los cambios en el código estos no se ven reflejados en el servidor web WEBrick (a pesar de restaurar el navegador), deberás reiniciar el servidor web para ver los cambios.

http://127.0.0.1:3000/clientes

Pantalla principal de nuestro CRUD desarrollada a través de scaffolding

Si presionamos sobre “New Cliente” nos habilitará a crear nuevos clientes.

Luego de ingresar el primero, nos mostrará la lista de los ingresados en el sistema y 3 nuevas operaciones que se aplican sobre nuestro ítem: Show, Edit, Destroy (Mostrar, Editar, Destruir).

Está demás decir que absolutamente toda la información que vemos, y su comportamiento, es alterable a nuestras necesidades.


Opción “New Cliente” nos permite dar nuestra primer Alta


Luego de ingresar nuestro primer cliente, tener acceso a las opciones de modificar o dar de baja



Finalmente, como se vería la página principal de nuestro ABM de Clientes luego de ingresar varios registros


La “cereza de la torta”: puliendo la castellanización

Como forma de entrar rápidamente en otro tema, para traducir a nuestro idioma los textos de nuestra aplicación (que originalmente son generados en inglés) deberemos editar por primera vez nuestras “plantillas” (templates) de código html. Como estamos dentro del patrón MVC estas plantillas se encontrarán ubicadas en la capa que representa la vista (explicado en la introducción al patrón) dentro del directorio de nuestro proyecto y con la extensión .rhtml:

C:\rails\miproyecto\app\views\clientes\edit.rhtml

Aquí podremos modificar todos los textos que están a la derecha de link_to, como por ejemplo:

<%= link_to 'Back', :action => 'list' %>

Cambiando por:

<%= link_to 'Volver', :action => 'list' %>

Si este comportamiento lo queremos hacer permanente, es decir, cada vez que nuestro sistema genere el código del “andamio”, deberemos modificar las plantillas del framework, ubicadas en:

cd [directorio_instalación_ruby]

cd \lib\ruby\gems\1.8\gems\actionpack-1.11.2\lib\action_controller\templates\scaffolds

Conclusión

Los expertos dicen que desarrollar con este framework permite crear una aplicación web en al menos diez veces más rápido que con una herramienta similar en Java. Parte del secreto está en el lenguaje de programación Ruby, en los Patrones de Diseño utilizados y en la filosofía de trabajo que sigue principios de Desarrollo Ágil.


Imagen “publicitaria”, muy provocativa, que compara la sencillez y el poder de RoR vs. J2EE de Java


¿Será el “Santo Grial” que estábamos buscando?

Aún no tengo la respuesta, pero el “lado bueno de la fuerza” está fluctuando hacia Ruby On Rails, y gracias a su popularidad, muchos otros proyectos de frameworks para desarrollo web están tomando fuerza; se puede decir que estamos entrando en la Era (¿o la moda?) de este tipo de estrategias de desarrollo.

Por lo pronto recomiendo empezar a conocerlo y a probarlo en ambientes “cerrados”, como una aplicación para una Intranet, implementar todas las operaciones clásicas de ABM y progresivamente implementar el resto de nuestros requerimientos para ir sumando experiencia en el framework y en este peculiar lenguaje de programación.

Y el tiempo dirá si esto es una moda pasajera o llegó para destronar a PHP, o tal vez, al mismo lenguaje Java con toda su parafernalia.

“EL REY HA MUERTO, ¡VIVA EL REY!”