Desarrollando con Ruby on Rails: ¿Estás listo para aumentar tu productividad?

Publicado en

Autor

Si estás involucrado en el desarrollo de aplicaciones web, seguramente has oido mencionar “Ruby on Rails” ultimamente. Ruby on Rails es una de las tecnologías más “candentes” del momento. Aunque dista mucho de tener la base instalada de aplicaciones y desarrolladores que PHP o Java, para proyectos nuevos es una de las principales tecnologías que se está considerando. Esto ha hecho que la demanda de desarrolladores Ruby este aumentando considerablemente. Así que si te interesa mantenerte actualizado, debes por lo menos conocer las bases de RoR.

Antecedentes

Ruby on Rails es un marco de trabajo (framework) para el desarrollo de aplicaciones web, escrito en el leguaje de programación Ruby. Ruby es un lenguaje dinámico orientado a objetos, con sintaxis inspirada en Python, Perl y Smalltalk. Ruby vio la luz en 1995 de la mano de Yukihiro “Matz” Matsumoto.

Ruby on Rails es la creación de David Heinemeier Hasson; todo comenzó en el 2004 con el desarrollo del producto estrella de la empresa 37 Signals, Basecamp. David extrajo el código base de la aplicación y de esta manera se dio el inicio de Ruby On Rails. Ruby on Rails —o Rails como lo nombraré en el resto del articulo— es un framework de “opinión”. Esto se refiere a que el marco de trabajo realiza una serie de suposiciones en las que asume cuál es la mejor forma de hacer las cosas. De esta forma provee un incremento en la productividad, ya que se encarga de la “talacha” y nos permite enfocarnos en las características que dan valor para el usuario final.

Principios

Rails se basa en una serie de principios filosóficos:

  • DRY. Son las siglas de “Don’t Repeat Yourself” y se refiere a evitar escribir el mismo código una y otra vez.
  • Convención sobre configuración. En base a “reglas de convención” y a través de generadores se crea un esqueleto básico de nuestra aplicación. Este esqueleto organiza archivos y directorios en categorías que dictan qué piezas de nuestra aplicación deben de acomodarse dentro de esa estructura. Con esto se evita el tener que definir incontables o larguísimos archivos de configuración para configurar tal organización.
  • TATFT. Son las siglas de “Test All The F* Time”, y se refiere a “probar todo el tiempo”. Rails se basa en la estrategia de Desarrollo Dirigido por Pruebas (Test Driven Development, TDD). Básicamente, ántes de escribir la funcionalidad requerida, vamos a escribir las pruebas o especificaciones con las que vamos a verificar que el comportamiento que implementemos sea el deseado.

Tecnología de Rails

MVC. Como ya vimos, Rails tiene una serie de conceptos filosóficos. En términos de estructura arquitectónica, Rails se basa en el patrón Modelo-Vista-Controlador (MVC). La mayoría de ustedes ya deberían conocer bien este patrón, ya que es muy utilizado, e incluso se han publicado artículos al respecto en ediciones anteriores de Software Guru. Aun así, demos un repaso rápido para explicarlo. El concepto de este patrón implica la separación lógica de las partes de nuestra aplicación. Para realizar el funcionamiente del sistema, se divide este en distintas piezas que pueden ser modelos, vistas o controladores. A continuación se explica cada uno:

  • Modelo. Representa a nuestro dominio, patrón implementa el patrón de ActiveRecord para todas las operaciones de manejo de información entre nuestros modelos y la base de datos. En el modelo también incluimos cosas como las validación y acciones especificas para realizar con la base de datos.
  • Controlador. Es el punto intermedio que se encarga de orquestar el flujo de operación de nuestra aplicación, es el responsable procesar las solicitudes del usuario y responder de manera adecuada.
  • Vista. Se usan para desplegar la información a los usuarios de manera amigable. En Rails se usa “Embedded” Ruby o ERB como se conoce comúnmente, el cual es un lenguaje de plantilla que combina html y Ruby para la generación de interfaces de usuario.

REST (Representational State Transfer). Es un paradigma para definir rutas en aplicaciones web. En base a REST, las aplicaciones de Rails determinan qué parte de aplicación mostrar y cómo responder a las solicitudes del usuario.

¿Como me inicio con Rails?

Una pregunta común que se hacen los desarrolladores nuevos a Ruby y Rails es si primero deben aprender el lenguaje Ruby o si mejor se enfocan en Rails y en el camino aprenden Ruby. Ámbos son caminos válidos.

La primera recomendación es visitar el sitio de Ruby On Rails [1], donde hay una serie de recursos a sitios y vídeos sobre el tema. En la referencia [2] (“¿Cómo iniciarse en Rails?”) pueden encontrar un listado de recursos en español e ingles sobre el tema. Para iniciarse en Ruby, la mejor opción es visitar el sitio de Ruby [3]. Y por último, visita las comunidades de Rails y/o Ruby. Incluso existen algunas de habla hispana como http://rails.mx y http://tijuana.rb.

Rails, al igual que Ruby son software libre y están disponibles para las plataformas Windows, Linux y OSX. Considero que no tiene caso usar este espacio para explicar como instalarlo, pero en http://decisionesinteligentes.com/guides pueden encontrar guías de instalación y configuración en español.

Ejemplo básico

A continuación vamos a explorar un ejemplo básico con Rails, aunque por cuestiones de espacio en el articulo actual, vamos a omitir la parte de pruebas. Partiremos de que ya se tiene un ambiente de desarrollo instalado y configurado, y haremos uso de la consola de comandos.

La aplicación que vamos a construir es una que nos permita publicar eventos y mostrar el listado de los mismos. Vamos a prescindir de características como autentificación y autorización con la finalidad de poder tener este prototipo funcionando en cuestión de minutos.

El primer comando que vamos a ejecutar va generar el esqueleto inicial de nuestra aplicación.

$ rails new quehacer

“quehacer” es el nombre de nuestra aplicación y “rails new” es el comando para crear la aplicación. Después de unos segundos tendremos un directorio llamado quehacer con una seria de archivos y carpetas.

Para iniciar con nuestra aplicación es necesario instalar las librerías que son dependencias de nuestra aplicación, en el mundo Ruby las librerías se conocen como Gemas (Gems). Rails hace uso de una herramienta llamada Bundler que automatiza la instalación de Gemas y sus dependencias.

$ cd quehacer
$ bundle install

Una vez que bundler ha terminado, podemos ejecutar nuestra aplicación, aunque a estas alturas nos mostrara únicamente una pantalla genérica de bienvenida.

$ rails server

Una vez iniciado el servidor navegamos a http://localhost:3000 y veremos la mencionada pantalla. El servidor lo podemos detener en la consola con un simple ctrl + c.

Scaffolding

Una manera muy rápida y sencilla de empezar a desarrollar en Rails es haciendo uso de “scaffold”. Simplemente ejecutamos un “scaffold” con la información de nuestro modelo y en cuestión de segundos tendremos un modelo, controlador y vistas listas para usarse, todo construido por Rails a partir de las “suposiciones” que mencionabamos en un inicio. Vamos generando un “scaffold” para el modelo “event”, el cual representara un evento.

$ rails generate scaffold event title:string description:text date:datetime address:string

Al ejecutar el comando tendremos una serie de archivos generados. Nuestro modelo event tendrá 4 datos a almacenar: título, descripción, fecha y dirección. Quizás se pueda necesitar más datos, pero para el caso practico de este ejemplo esto será suficiente.

Uno de los archivos que se genera automáticamente, y que vamos a revisar es el archivo de tipo migración. Este lo vamos a encontrar en el subdirectorio db/migrate de nuestra aplicación. Parte del nombre del archivo será create_event.rb, en mi caso el archivo es 20101224222550_create_events.rb en su caso el valor del timestamp será diferente.

Dentro de este archivo vamos a encontrar instrucciones de Ruby para crear una tabla de eventos en nuestra base de datos. La ventaja de que estas instrucciones estén escritas en Ruby es que nos permite que sean independientes del manejador de base de datos. Por omisión, en nuestra aplicación estamos usando SQLite3, pero bien pudiésemos estar usando MySql, Postgresql, Oracle o Microsoft SQL Server. El archivo que configura el motor de base de datos a usar es config/database.yml.

El archivo de migración tiene dos secciones: up y down. Ambas son utilizadas para poder realizar rollbacks a cambios realizados en la base de datos, ademas de que las migraciones en Rails tienen versión, con lo que podemos manejar los cambios al esquema de la base de datos.

Para aplicar la migración ejecutamos:

$ rake db:migrate

En este punto podemos volver a ejecutar nuestra aplicación y ya tendremos la funcionalidad de Crear, Ver y Actualizar eventos, esto gracias a que en el proceso de “scaffold” nos creo el controlador del evento en “app/controllers/event_controller.rb”, el cual define 7 acciones que siguen el estándar REST mencionado anteriormente:

  • Index
  • Show
  • New
  • Create
  • Edit
  • Update
  • Destroy

El controlador en este momento está completamente funcional. Hay que notar que el nombre del controlador sigue una convención _controller, que también al igual que REST es una convención establecida en Rails.

Al igual que el controlador, el “scaffold” genero las vistas: index.html.erb, show.html.erb, new.html.erb, edit.html.erb, _form.html.erb. Estas son utilizadas por el controlador para responder a las acciones, de hecho no es casualidad que el nombre de las vistas concuerden con algunas de las acciones del controlador.

Dentro del código del controlador del evento, a manera de comentario para cada acción, nos indica cómo podemos navegar a cada acción a través del navegador. Por ejemplo, para ver el listado de eventos navegamos a /events o para crear un nuevo evento navegamos a /events/new. Si inicias el servidor y visitas http://localhost:3000/events/new verás algo parecido a la figura 1.

Figura 1. Forma para crear un nuevo evento

Rutas

Las rutas de nuestra aplicación están definidas en el archivo config/routes.rb, al inicio del archivo vamos a encontrar la linea resources :events. Con esa sola instrucción nos aseguramos que evento responda a la convención REST. Para ver como están configuradas las rutas podemos ejecutar:

$ rake routes

y el resultado será el siguiente:

GET
/events(.:format)
{:action=>”index”, :controller=>”events”}

POST
/events(.:format)
{:action=>”create”, :controller=>”events”}

new_event
GET
/events/new(.:format)
{:action=>”new”, :controller=>”events”}

edit_event
GET
/events/:id/edit(.:format)
{:action=>”edit”, :controller=>”events”}

event
GET
/events/:id(.:format)
{:action=>”show”, :controller=>”events”}

PUT
/events/:id(.:format)
{:action=>”update”, :controller=>”events”}

DELETE
/events/:id(.:format)
{:action=>”destroy”, :controller=>”events”}

Listado 1. Rutas REST en nuestra aplicación.

Modelo

Finalmente, revisaremos el modelo de nuestro evento, el cual encontraremos en app/models/event.rb. Curiosamente, nos daremos cuenta que el archivo no contiene prácticamente código. Gracias a la convención usada por Rails, nuestro modelo funciona sin problemas. Algo que podemos hacer es agregar validación para prevenir que se guarde un evento sin titulo y descripción.

Para agregar la validación editamos app/models/event.rb y justo entre la linea de declaración de clase y end agregamos la siguiente linea:

validates_presence_of :title, :description

Guardamos el modelo, ejecutamos el servidor y tratamos de crear un evento nuevo sin llenar el formulario, vamos a encontrarnos que Rails nos muestra un mensaje de error, además de indicarnos qué campos son los que ocasionan este error (ver figura 2).

Figura 2. Mensajes de error al intentar guardar un evento.

Conclusión

A través del articulo tuvimos la oportunidad de conocer sobre Ruby on Rails y cómo de manera muy rápida podemos crear un prototipo funcional. Este ejercicio también nos permitió conocer sobre la convención que utiliza Rails y que nos ayuda a evitar tomar decisiones sobre la arquitectura de la aplicación, permitiéndonos enfocarnos de manera rápida en lo que proporciona valor a nuestros nuestros usuarios.

Este ejemplo apenas toco los temas mas básicos de Rails, aun queda mucho mas por aprender para desarrollar aplicaciones “a la usanza de Rails” y lograr tener aplicaciones que cumplan con las necesidades de los usuarios y que sean mantenibles al mismo tiempo.

Rails actualmente cuenta con una comunidad muy activa de individuos y empresas que le están apostando a esta forma de hacer aplicaciones web. Rails también ha sido un ejemplo a seguir en otros lenguajes de programación, y hoy en día podemos encontrar marcos de trabajo parecidos o modelados a partir de Rails en lenguajes como Phyton, PHP, Java y .NET.

Bio

Mario Chávez es Ingeniero en Sistemas y radica en Tijuana, México. Se especializa en desarrollo con Ruby on Rails y es desarrollador independiente (http://decisionesinteligentes.com). También es fundador de la comunidad http://tijuana.rb.