Esta semana empecé a desarrollar una aplicación en Ruby on Rails, que no es una plataforma que domino, y quedé gratamente sorprendido por lo fácil que es empezar y las cosas que se logran con poco esfuerzo.
Pero primero que nada, ¿qué es Ruby on Rails? De hecho son dos cosas.
Ruby es el lenguaje de programación, que tiene como característica que es bastante flexible. Como lenguaje me resultó sumamente interesante.
Rails por su parte, es un framework que extiende el lenguaje y se utiliza para crear aplicaciones web.
Scaffolding
Ruby on Rails se basa en el patrón
Model-View-Controller, que (muy) básicamente permite separar la capa de presentación (view) de la capa de datos (model) y las conecta mediante un intermediario (controller).
Una funcionalidad muy buena de Rails, es que permite generar un Model con sus correspondientes Views y Controller en un solo comando. Esta operación se realiza con el comando
scaffold (la traducción sería algo así como "andamio").
Para generar una nueva entidad, digamos por ejemplo Persona, con los campos nombre, apellido y fecha de nacimiento, sería algo así:
rails generate scaffold Persona nombre:string apellido:string fecha_nacimiento:datetime
Esto genera:
- La clase Persona (model) con los campos persona_id, nombre, apellido, fecha_nacimiento, y por defecto agrega campos created_at y updated_at
- El script para migrar la base de datos creando la nueva tabla
- El controller para manejar varias operaciones: index (lista de elementos), show (detalle de un item), edit, delete, new y create.
- Los archivos HTML correspondientes a las vistas, para cada una de las operaciones anteriores.
Si lo fuera a comprar con
GeneXus, sería como generar la transacción y el patter WorkWith con los valores por defecto, con un solo comando...
Programación declarativa
No se si ese es el nombre que se le da, pero es la forma en que se programan muchas cosas.
Por ejemplo, si quiero agregar seguridad a mi aplicación usando Devise (ver más adelante), alcanza con poner la siguiente línea dentro de la clase controller
before_filter :authenticate_user!
Otro ejemplo, si quiero que el nombre de la persona sea obligatorio, puedo agregar una validación en la clase model, con lo siguiente:
validates :nombre, :presence => true
Listo, con ese código, si al crear una nueva persona dejo en blanco el nombre, me va a dar un error.
Gems
Las Gems en Ruby, son las bibliotecas de funciones.
Existen muchas que funcionan con Rails agregando funcionalidad específica, por ejemplo para agregar autenticación de usuarios y autorización.
Devise (autenticación)
Devise agrega una capa de autenticación de usuarios. Es sumamente flexible y a la vez fácil de instalar y configurar (no voy a entrar en detalles).
Para agregar autenticación alcanza con instalar este gem, ejecutar un par de comandos para que genere un model para los usuarios, y agregar el
before_filter que figura más arriba para exigir que el usuario esté logueado para acceder a una determinada página.
CanCan (autorización)
CanCan se encarga de la autorización, y se integra con Devise o con cualquier otro sistema de autenticación.
Agregar autorización es tan simple como definir en un archivo que cosas puede hacer un usuario dado su rol, y preguntar si el usuario tiene permisos para realizar una determinada acción. Por ejemplo, para saber si el usuario puede modificar una persona, el código a agregar es el siguiente:
if can? :update, Persona
# seguir adelante
else
# ir a alguna página de error
end
Recursos
Con respecto a los recursos, para aprender un poco sobre Rails estuve leyendo
Ruby on Rails Tutorial, que está bastante interesante y da una buena idea de como se trabaja en Rails. Además usa Test Driven Development como metodología, así que ya viene bien para conocer un poco de TDD.
Hay un sitio web llamado
Railscasts que tiene videos que explican paso a paso como hacer varias cosas. Con más de 240 videos, hay como para entretenerse.
Conclusión
Me gustó tanto el lenguaje (Ruby) como la plataforma (Rails). Se pueden lograr cosas muy interesantes con relativamente poco esfuerzo.
Todavía soy un novato en este tema, pero parece ser muy bueno.