jueves, 9 de diciembre de 2010

Primeras impresiones de Ruby on Rails

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.

4 comentarios:

  1. Marcos: Que IDE estas usando para trabajar con Ruby?, yo tambien comencé a hacer mis pininos con este lenguaje (No me he metido con Rails) usando el plugin para NetBeans, ojalá sigas compartiendo tu aprendizaje con nosotros en el blog. Saludos!

    ResponderEliminar
  2. Aluziner: Estoy usando un editor que se llama Redcar. No es un IDE, aunque tiene algunas cosas específicas para desarrollar en Ruby.

    Al principio probé Eclipse, con un plugin para Ruby on Rails, pero me resultó demasiado pesado. Con Redcar y ejecutando los comandos de Rails en un Terminal me manejo bien.

    Algunas cosas interesantes que tiene:

    1. Te permite abrir un directorio, por lo que tenés siempre visibles dentro del editor todos los archivos del proyecto

    2. Tiene "syntax coloring" y "code completion" (el último mediante un plugin) para Ruby.

    3. Está escrito en Ruby, por lo que siempre va a tener soporte para Ruby :)

    ResponderEliminar
  3. Marcos: Grcias, tambien he probado Clipse, en ese estoy haciendo mis pininos de aplicaciones para Android para ir conociendo mas la plataforma además de lo que se podrá hacer con Genexus. Voy a instalar algun plugin especifico para Ruby on Rails para probar.

    ResponderEliminar
  4. Tuve la misma experiencia con ruby es muy sencilla generar una aplicación con un par de clicks...inclusive la conexion a la base mysql no me llevo ningun problema mas que configurar los parametros de conexion....
    Al igual que Aluziner uso NetBeans como IDE y lo recomiendo...
    Toda la generacion la pones con el comando Generate-> y ahi eliges si todo scaffold o controller o model o lo que quieras...y te genera el codigo de las vistas y todo sin que tengas que tu mismo ejecutar el comando...
    La unica dificultad que tiene me parece ser que se piensa bastante "distinto" a los lenguajes orientados a objetos con los que estamos acostumbrados a programar, yo vengo de PHP y la verdad hay una diferencia importante a como pensar las aplicaciones..aunque si ya usaste un framework seguramente veas muchas cosas parecidas...me asombro de hecho lo muy parecido que es Ruby on Rails a PHP+Joomla...

    Salu2

    ResponderEliminar