1. 28-32 CODE26.internet.qxd 5/16/06 12:47 PM Page 28
{internet | Ruby}
DESARROLLO WEB ÁGIL
Ruby On Rails
Ruby on Rails es un framework de desarrollo web diseñado para aumentar
extremadamente la productividad, que está empezando a causar furor.
Enrique Place
Consultor especializado /blog/display/5
en Free Software y en Open Source.
enriqueplace.blogspot.com
1. Respuesta /dispatcher.rb?
Navegador Apache o controller=blog&
Web WEBrick action=display&
id=5
proximadamente desde 1997 me desempe-
A ño como consultor en proyectos relacio-
nados con Software Libre, y con el correr
de los años, esta temática se ha ido orien-
tado al ambiente web. Desde mis inicios, he optado por
6. Pantalla
2. Envío
Dispatcher
1. Configure framework
2. Wrap CGI in request
PHP, pues era (en mi experiencia) la mejor alternativa 3. Creación
disponible entre los lenguajes de desarrollo web. Des-
carté opciones propietarias como ASP, y otras Open 4a. CRUDs Registro
5a.Renders
Source como Perl, principalmente, porque PHP me Control activo
Acción 4b. Envío
ofrecía la mayor libertad al más bajo costo. de acción
Hasta el día de hoy, sigo pensando lo mismo, pero
algo ha cambiado. Cada vez disponemos de menos
tiempo para concretar nuestros proyectos, necesita-
mos dar más valor agregado a los desarrollos que rea- 5b.Redireccionar
lizamos y debemos adaptarnos más rápido a los cam- Mailer
bios: lo que sucede es que nos están obligando a ser
cada vez más productivos.
Si hace algunos años que trabajan en ambientes web
y no tienen la filosofía de reaprovechar los avances de [Figura 2] Diagrama que describe el funcionamiento de RoR.
sus desarrollo de software en beneficio de los proyec-
tos futuros, estarán siendo parte de la famosa “fábrica
de ruedas”; es decir, estarán reinventando la rueda de fue desarrollado por completo con el lenguaje de programación Ruby. A pesar
forma constante sin aprovechar la experiencia adqui- de que ustedes quizá usen Rails, en algún momento necesitarán escribir códi-
rida con el pasar de los años. De esta forma, será im- go en el lenguaje Ruby. Por todas estas razones, es que el nombre combina am-
posible ser “extremadamente productivo”. bas cosas: Ruby On Rails
RoR está basado fuertemente en una estructura con persistencia de datos, pe-
¿Qué es Ruby On Rails? ro lo que nos debe importar es que las grandes bases de datos del Software Li-
Como no debemos tener miedo a lo nuevo ni a los bre, como MySQL y PostgreSQL, se encuentran disponibles.
cambios, y debemos estar informados y lograr hacer Su creador, el danés David Heinemeier Hansson (DHH), generó este frame-
juicios de valor apoyados en experiencias reales y no work para cubrir las necesidades de desarrollo de un proyecto web, y fue ga-
en meras suposiciones, me animé a experimentar con lardonado con el título Best Hacker 2005 en el evento O´Reilly Open Source
otras alternativas. Awards, organizado por Google.
Ruby On Rails, muchas veces abreviado como RoR, Según ha expresado en entrevistas, esta idea surgió de dos ámbitos de ex-
significa “Rubí sobre Rieles” y, por definición, es un periencia al empezar a trabajar con RoR: PHP (rápido y sucio) y Java/J2EE
framework Open Source para desarrollo rápido de (lento y limpio). El objetivo de RoR era tratar de unir lo mejor de ambos
aplicaciones web. Si somos estrictos, veremos que el (rápido y limpio).
nombre está compuesto por
dos palabras clave: Ruby por El lenguaje de programación Ruby
un lado y Rails por el otro. Vale decir que llegamos indirectamente al lenguaje. A pesar de que la ma-
En realidad, el framework se yoría de las distribuciones GNU/Linux incluyen a Ruby (entre muchos otros
llama, simplemente, Rails y lenguajes), hasta hace poco tiempo, éste no era muy popular. El autor de
Ruby se llama Yukihiro Matsumoto, de origen japonés, más conocido por
el seudónimo de Matz.
Entre las cualidades de este lenguaje podemos mencionar que es totalmente
[Figura 1] orientado a objetos (más que otros muy populares), de alto nivel y, sobre todo,
Logo de Ruby On Rails. “divertido de programar” (según las palabras de su autor).
28 users.code
2. 28-32 CODE26.internet.qxd 5/16/06 12:47 PM Page 29
Concepto base I: el patrón MVC
Los Patrones de diseño evitan tener que reinventar la rueda para
resolver problemas ampliamente conocidos y resueltos innumera- Person
bles veces, a la vez que nos sirven de modelo para hacer soluciones lastName
“reutilizables” y “extensibles”, porque aplican las mejores prácticas firstName
del Diseño Orientado a Objetos. numberOfDependents
Este framework se basa en un patrón de diseño muy conocido, el insert
Modelo, Vista, Controlador (MVC). La idea del patrón es separar el update
problema en tres capas: el modelo, que representa la lógica del sis-
tema; la vista, que se encarga de mostrar la información del mode- getExemption
lo; y el controlador, que toma las acciones del usuario del sistema isFlaggedForAudit
e interactúa con el modelo y con la vista. getTaxableEarnings
Nuestro sistema quedará estructurado en tres capas independien-
tes, que tienen responsabilidades distintas y bien diferenciadas,
con lo cual se logra que sea más fácil de desarrollar y de mantener. [Figura 3] Representación UML del patrón de diseño
ActiveRecord.
Concepto base II: el patrón ActiveRecord
En Ruby On Rails, el Modelo del patrón MVC se implementa a tra-
vés del mapeo del “objeto” con su correspondiente “tabla” en la ba-
se de datos.
Este patrón resuelve el eterno problema de la comunicación en-
tre modelos de datos distintos, entre el Relacional y el Orienta-
do a Objetos.
¿Cómo se instala?
Existe mucha información en Internet, pero a veces, ésta puede
ser inexacta o cometer pequeños errores. Si no tenemos experien-
cia en RoR, es frustrante iniciarse con tanta dificultad extra.
Instalación en Windows (tres pasos)
El primer y mejor tutorial que existe hasta el momento para ha-
cer una instalación es de O'Reilly: www.onlamp.com/pub/a/onlam-
p/2005/01/20/rails.html (“Rodando con Rubí sobre Rieles”), pero
sólo contempla el sistema operativo Windows. Por esa razón, va-
mos a hacer una explicación que abarque ambas instalaciones, ya
que, a pesar de que son muy parecidas, tienen pequeños detalles
que se deben tener en cuenta. [Figura 4] Pantalla de instalación de Rubyinstaller,
con las aplicaciones que incluye por defecto.
> Paso 1: Instalar Ruby
Bajamos el instalador de Ruby desde http://rubyinstaller.ruby-
forge.org. Éste ya incluye Gems (http://rubygems.rubyforge.org), la Successfully installed rails-1.0.0
aplicación que permite instalar el framework Rails y que usaremos Successfully installed activesupport-1.2.5
en el paso siguiente. Successfully installed activerecord-1.13.2
Successfully installed actionpack-1.11.2
> Paso 2: Instalar Rails Successfully installed actionmailer-1.1.5
Si ya tenemos instalado Gems, sólo debemos abrir una ventana Successfully installed actionwebservice-1.0.0
que permita escribir comandos desde la línea. Desde la barra de ta- Installing RDoc documentation for
reas, presionamos: activesupport-1.2.5...
Installing RDoc documentation for
Botón de Inicio-> Ejecutar -> y escribe “cmd” activerecord-1.13.2...
[Mensaje resumido]
Al presionar ENTER, se ejecutará una consola DOS que nos per-
mitirá digitar los comandos del instalador del framework. Debere- Si no se agrega el último parámetro (“incluir dependencias”), por
mos posicionarnos, primero, en el directorio donde instalamos cada software que falte, va a preguntar si queremos instalarlo, lo
Ruby (acción realizada en el Paso 1): que sucede casi en seis oportunidades.
cd c:rubybin > Paso 3: Instalar MySQL
Al principio, no debemos complicarnos. Si lo que queremos es pro-
C:rubybin>gem install rails --remote -- bar el entorno de desarrollo, cuando el instalador de MySQL nos
include-dependencies pregunte por el usuario administrador, indicamos “root” y su clave
“root”. Más adelante podremos asegurar todas estas configuraciones.
Attempting remote installation of 'rails'
Updating Gem source index for: Descarga del instalador MySQL:
http://gems.rubyforge.org dev.mysql.com/downloads/mysql
29
3. 28-32 CODE26.internet.qxd 5/16/06 12:47 PM Page 30
{internet | Ruby}
Probar la instalación de RoR cd miproyecto
En primera instancia, debemos tener disponible el co- ruby script/server
mando rails desde nuestra consola. Para probarlo, nos
posicionamos en un directorio donde alojaremos nues- El último comando ejecuta el servidor. Nuestro servidor atenderá el puerto
tros proyectos web basados en RoR. En Windows, po- 3000. Si usamos el navegador y apuntamos a la dirección http://local-
dremos crear la misma estructura a partir del “directo- host:3000 (localhost representa nuestro servidor local), nos deberá responder
rio base”, llamado c:rails. un mensaje de bienvenida, como se observa en la [Figura 5].
Nuestro primer proyecto La primera aplicación útil
Nos dirigimos al directorio base correspondiente a Para hacer una prueba del nuestro entorno “veloz” de desarrollo, qué mejor
nuestro sistema, y ejecutamos el comando rails y el nom- que hacer “esa” actividad que se repite una y otra vez en nuestros sistemas, y
bre del proyecto que deseamos crear. La idea es que el que el framework ya tiene sumamente resuelta: nuestro primer ABM (Altas,
framework cree un subdirectorio con el nombre que in- Bajas y Modificaciones).
gresamos y, luego, él armará una serie de subdirectorios Debemos crear la primera base de datos y la primera tabla. Ejecutamos nues-
y archivos que corresponderán a la estructura inicial, pa- tro cliente de turno para trabajar con MySQL (existen muchos, pero podemos
ra poder comenzar a trabajar en nuestro proyecto RoR: bajar los oficiales desde www.mysql.com/products/tools), y creamos la base de
datos “miproyecto” y la tabla “cliente”, con la siguiente estructura:
rails miproyecto
CREATE TABLE `miproyecto`.`clientes` (
Esto producirá la siguiente salida por pantalla: `id` int(3) NOT NULL auto_increment,
`nombre` varchar(45) default NULL,
create `telefono` varchar(45) default NULL,
create app/controllers PRIMARY KEY (`id`)
create app/helpers ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
create app/models
create app/views/layouts Tenemos que definir cuál es la configuración de nuestra base de datos, edi-
create config/environments tando, en Windows, el siguiente archivo: C:railsmiproyectoconfigdataba-
create components se.yml. A continuación, modificamos el nombre de la base, agregamos la cla-
create db ve del usuario y comentamos la línea “socket”:
create doc
create lib development:
create lib/tasks adapter: mysql
create log database: miproyecto
create public/images username: root
[Mensaje resumido] password: root
#socket: /path/to/your/mysql.sock
Entramos en el directorio de nuestra aplicación y ejecu-
tamos un mini servidor web para probar que el entorno Si queremos ir rápido y seguro, podemos usar los “andamios” (scaffolding).
RoR esté respondiendo: Scaffold es un veloz generador de CRUD: Create, Retrive, Update y Delete, lo
que significa, en castellano, un ABM. Posicionados en el directorio base del
proyecto, ejecutamos el comando para generar el modelo:
C:rails>cd miproyecto
C:railsmiproyecto>ruby scriptgenerate 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, éstos no se ven reflejados en
[Figura 5] Pantalla de bienvenida que nos devuelve el servidor web WEBrick (a pesar de restaurar el navegador), deberemos rei-
el servidor WEBrick, confirmando que todo fue niciar el servidor para verlos. http://127.0.0.1:3000/clientes
instalado y configurado correctamente.
30 users.code
4. 28-32 CODE26.internet.qxd 5/16/06 12:47 PM Page 32
{internet | Ruby}
Si presionamos sobre New Client, podremos crear nuevos clientes. Luego de agregar el
primero, aparecerá la lista de los ingresados en el sistema, junto con tres nuevas operacio-
nes que se aplican sobre nuestro ítem: Show, Edit y Destroy (Mostrar, Editar, Destruir).
Está de más decir que absolutamente toda la información que vemos, y su comporta-
miento, puede modificarse según nuestras necesidades.
La “cereza de la torta”: pulir la castellanización
Como forma de entrar rápidamente en otro tema, para traducir a nuestro idioma los tex-
tos de la aplicación (que, en un principio, son generados en inglés), deberemos editar las [Figura 6] Pantalla principal
“plantillas” (templates) de código html. Como estamos dentro del patrón MVC, éstas se en- de nuestro CRUD, desarrollada
contrarán en la capa que representa la vista (tema explicado en la introducción al patrón), a través de scaffolding.
dentro del directorio de nuestro proyecto y con la extensión .rhtml:
C:railsmiproyectoappviewsclientesedit.rhtml
Aquí podremos modificar todos los textos que están a la derecha de link_to, como:
<%= link_to 'Back', :action => 'list' %>
Cambiando por:
<%= link_to 'Volver', :action => 'list' %>
Si queremos que este comportamiento sea permanente –es decir, que cada vez nuestro
sistema genere el código del “andamio”–, deberemos modificar las plantillas del frame-
work, ubicadas en:
[directorio_instalación_ruby]librubygems1.8gemsactionpack-1.11.2lib [Figura 7] La opción New Client
action_controllertemplatesscaffolds nos permite hacer nuestra primera Alta.
Conclusión
Los expertos dicen que desarrollar con este framework permite crear una aplicación
web, 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 utiliza-
dos y en la filosofía de trabajo que sigue principios de Desarrollo ágil. ¿Será el Santo Grial
que estábamos buscando? Aún no tenemos 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 en-
trando en “la Era” (¿o la moda?) de este tipo de estrategias de desarrollo.
Por lo pronto, recomendamos empezar a conocerlo y a probarlo en ambientes “cerrados”
(como una aplicación para una Intranet), poner en práctica todas las operaciones clásicas [Figura 8] Luego de ingresar el primer
de ABM y, progresivamente, implementar el resto de nuestros requerimientos para ir su- cliente, tenemos acceso a las opciones
mando experiencia en el framework y en este peculiar lenguaje de programación. de modificar o dar de baja.
Y el tiempo dirá si esto es una moda o si llegó para destronar a PHP, o tal vez, al mis-
mo lenguaje Java con toda su parafernalia. q
Enrique Place es Consultor en Tecnologías de la Informa-
ción, especializado en Free Software y Open Source desde
1997. Ha participado en varios proyectos gubernamentales y
privados uruguayos, donde estas tecnologías fueron un fac-
tor clave para el desarrollo de sistemas.
En la actualidad, está participando en un proyecto de
eGovernment (www.comprasestatales.gub.uy), investigando
sobre Ruby On Rails y dictando cursos sobre Programación
PHP5 y Patrones de Diseño, en universidades locales.
[Figura 9] Finalmente, así se vería
Ruby tiene lo mejor de otras la página principal de nuestro ABM
tecnologias y eso hace que de Clientes, después de ingresar
muchos opten por él. varios registros.
32 users.code