Ruby on Rails
# Ruby on Rails

Ruby on Rails, también conocido como RoR o Rails, es un framework de aplicaciones web de código abierto escrito en el lenguaje de programación Ruby, siguiendo el paradigma del patrón Modelo Vista Controlador (MVC). Trata de combinar la simplicidad con la posibilidad de desarrollar aplicaciones del mundo real escribiendo menos código que con otros frameworks y con un mínimo de configuración. El lenguaje de programación Ruby permite la metaprogramación, de la cual Rails hace uso, lo que resulta en una sintaxis que muchos de sus usuarios encuentran muy legible. Rails se distribuye a través de RubyGems, que es el formato oficial de paquete y canal de distribución de bibliotecas y aplicaciones Ruby.

## Filosofía

Los principios fundamentales de Ruby on Rails incluyen No te repitas (del inglés Don't repeat yourself, DRY) y Convención sobre Configuración.

No te repitas significa que las definiciones deberían hacerse una sola vez. Dado que Ruby on Rails es un framework de pila completa, los componentes están integrados de manera que no hace falta establecer puentes entre ellos. Por ejemplo, en ActiveRecord, las definiciones de las clases no necesitan especificar los nombres de las columnas; Ruby puede averiguarlos a partir de la propia base de datos, de forma que definirlos tanto en el código como en el programa sería redundante.

Convención sobre configuración significa que el programador sólo necesita definir aquella configuración que no es convencional. Por ejemplo, si hay una clase User en el modelo, la tabla correspondiente de la base de datos es users (en plural), pero si la tabla no sigue la convención (por ejemplo blogposts) debe ser especificada manualmente (self.table_name = "blogposts") en el modelo. Así, cuando se diseña una aplicación partiendo de cero sin una base de datos preexistente, el seguir las convenciones de Rails significa usar menos código (aunque el comportamiento puede ser configurado si el sistema debe ser compatible con un sistema heredado anterior).

## Historia

Ruby on Rails fue escrito por David Heinemeier Hansson a partir de su trabajo en Basecamp, una herramienta de gestión de proyectos, por 37signals. Fue liberado al público por primera vez en julio de 2004.

Lanzamientos :

| Fecha | Lanzamiento |
| - | - |
| 4 de enero de 2005 | Rails 0.9.3 |
| 13 de diciembre de 2005 | Rails 1.0 |
| 22 de marzo de 2006 | Rails 1.1 RC1 |
| 23 de noviembre de 2006 | Rails 1.2 RC1 |
| 19 de enero de 2007 | Rails 1.2 |
| 7 de diciembre de 2007 | Rails 2.0 |
| 1 de junio de 2008 | Rails 2.1 |
| 21 de noviembre de 2008 | Rails 2.2 |
| 16 de marzo de 2009 | Rails 2.3 |
| 29 de agosto de 2010 | Rails 3.0 |
| 22 de mayo de 2011 | Rails 3.1 RC |
| 25 de junio de 2013 | Rails 4.0 |
| 18 de febrero de 2014 | Rails 4.1 RC1 |
| 30 de junio de 2016 | Rails 5.0 |
| 27 de abril de 2017 | Rails 5.1 |
| 9 de abril de 2018 | Rails 5.2 |
| 15 de agosto de 2019 | Rails 6.0 |
| 9 de diciembre de 2020 | Rails 6.1 |
| 15 de diciembre de 2021 | Rails 7.0 |
| 6 de enero de 2022 | Rails 7.0.1 |
| 8 de febrero de 2022 | Rails 7.0.2 |
| 9 de mayo de 2022 | Rails 7.0.3 |

## Arquitectura MVC de Rails

Las piezas de la arquitectura Modelo Vista Controlador en Ruby on Rails son las siguientes:

### Modelo

El modelo en MVC representa las reglas y lógica de negocio. Este modelo es una implementación de la arquitectura Active Record, que en sí es un mapeo objeto-relacional, el cual permite: representar modelos y sus datos, representar asociaciones entre modelos, representar jerarquías de herencia a través de modelos relacionados, validar los modelos antes de persistirlos en la base de datos y realizar operaciones de bases de datos de forma orientada a objetos.

Al emplear las convenciones sobre configuración que sugiere Ruby on Rails se asegura de no tener que hacer ninguna configuración extra para implementar el patrón Active Record adecuadamente. La idea es que si siempre se configuran las aplicaciones de la misma forma esta debería ser la forma predeterminada (la convención) y solo tendría que hacer configuraciones cuando exista una excepción a la convención. Es así como el ActiveRecord de Rails logra hacer la asignación de las clases y las tablas en la base de datos para la representación de los modelos. Rails pluraliza el nombre de la clase (por convención los modelos son nombrados en singular) para encontrar el nombre de la tabla correspondiente en la base de datos. Los métodos para convertir una palabra de singular a plural (y viceversa) de Rails son muy eficientes tanto para palabras regulares como irregulares en inglés, es por ello que se aconseja nombrar los modelos en inglés.

### Vista

En MVC, es la lógica de visualización, o cómo se muestran los datos de las clases del Controlador. Con frecuencia en las aplicaciones web la vista consiste en una cantidad mínima de código incluido en HTML.

Existen en la actualidad muchas maneras de gestionar las vistas. El método que se emplea en Rails por defecto es usar Ruby Empotrado (archivos.rhtml, desde la versión 2.x en adelante de RoR archivos.html.erb), que son básicamente fragmentos de código HTML con algo de código en Ruby, siguiendo una sintaxis similar a JSP. También pueden construirse vistas en HTML y XML con Builder o usando el sistema de plantillas Liquid.

Es necesario escribir un pequeño fragmento de código en HTML para cada método del controlador que necesita mostrar información al usuario. El "maquetado" o distribución de los elementos de la página se describe separadamente de la acción del controlador y los fragmentos pueden invocarse unos a otros.

### Controlador

En MVC, las clases del Controlador responden a la interacción del usuario e invocan a la lógica de la aplicación, que a su vez manipula los datos de las clases del Modelo y muestra los resultados usando las Vistas. En las aplicaciones web basadas en MVC, los métodos del controlador son invocados por el usuario usando el navegador web.

La implementación del Controlador es manejada por el ActionPack de Rails, que contiene la clase ApplicationController. Una aplicación Rails simplemente hereda de esta clase y define las acciones necesarias como métodos, que pueden ser invocados desde la web, por lo general en la forma http://aplicacion/ejemplo/metodo, que invoca a EjemploController#método, y presenta los datos usando el archivo de plantilla /app/views/ejemplo/método.html.erb, a no ser que el método redirija a algún otro lugar.

Rails también proporciona andamiaje, que puede construir rápidamente la mayor parte de la lógica y vistas necesarias para realizar las operaciones más frecuentes.

## Otros módulos

Además, Rails ofrece otros módulos, como Action Mailer (para enviar correo electrónico) o Active Resource que proporciona la infraestructura necesaria para crear de manera sencilla recursos REST, algo por lo que apuesta claramente Rails en sus últimas versiones desplazando así a otros modelos como SOAP y XML-RPC a los que se les daba soporte en versiones anteriores mediante Action Web Service.

### Ajax on Rails

Ajax es una técnica que permite usar Javascript y XML para procesar peticiones de un navegador web a un servidor web como procesamiento en segundo plano sin cargar otras páginas web adicionales. Rails proporciona diferentes facilidades que hacen más fácil implementar aplicaciones Ajax.

Rails incluye la libreria de Javascript jQuery (una serie de herramientas que proporcionan llamadas Ajax y otra funcionalidad habitual en las tareas cliente-servidor) y script.aculo.us, una biblioteca en Javascript con mejoras en la interfaz de usuario (controles avanzados en los formularios, efectos visuales, arrastrar y soltar, etc.).

## Gemas

Las gemas son plugins y/o códigos añadidos a nuestros proyectos Ruby on Rails, que nos permiten nuevas funcionalidades como nuevos create, nuevas funciones predefinidas (como login de usuarios) o nuevas herramientas para el desarrollo como puedan ser Haml y SASS (la primera es una nueva forma de template basada en html pero más sencilla y potente, y la segunda es igual pero para el caso de las CSS). Para encontrar el listado de gemas disponibles puedes ir a RubyForge.

## Soporte de servidores Web

Para desarrollo y pruebas, se utiliza Mongrel o WEBrick, incluido con Ruby. Para utilizar Rails en servidores en producción se está extendiendo el uso de Passenger, una suerte de mod_rails para Apache desarrollado en 2008 por la empresa neerlandesa Phusion. Otras opciones para producción son Nginx, Mongrel, Apache, Lighttpd con FastCGI o alguna combinación de ambos(por ejemplo utilizando Apache como proxy para los procesos Mongrel). Sobre Apache, mod ruby puede mejorar considerablemente el rendimiento, aunque su uso no se recomienda porque no es seguro utilizar múltiples aplicaciones RoR sobre Apache.

## Soporte de bases de datos

Dada que la arquitectura Rails favorece el uso de bases de datos se recomienda usar un SGBDR para almacenamiento de datos. Rails soporta la biblioteca SQLite por defecto. El acceso a la base de datos es totalmente abstracto desde el punto de vista del programador, es decir que es agnóstico a la base de datos, y Rails gestiona los accesos a la base de datos automáticamente (aunque, si se necesita, se pueden hacer consultas directas en SQL) Rails intenta mantener la neutralidad con respecto a la base de datos, la portabilidad de la aplicación a diferentes sistemas de base de datos y la reutilización de bases de datos preexistentes. Sin embargo, debido a la diferente naturaleza y prestaciones de los SGBDRs el framework no puede garantizar la compatibilidad completa. Se soportan diferentes SGBDRs, incluyendo MySQL, PostgreSQL, SQLite, IBM DB2 y Oracle.

## Requisitos

* Servidor web como Apache 1.3.x o 2.x, lighttpd, algún servidor web compatible con FastCGI con un módulo similar a mod_rewrite, o Nginx. Para desarrollo, Rails permite utilizar Mongrel (un servidor HTTP ligero creado para soportar aplicaciones en Ruby y muy extendido entre aplicaciones en producción) o WEBrick (un pequeño servidor a medida de rendimiento limitado y no recomendado para su uso en producción). Rails soporta la extensión mod ruby de Apache (servidor web).
* Base de datos(por ejemplo, MySQL, PostgreSQL, o SQLite)

## Entorno de Trabajo

Hay muchas alternativas para trabajar con Ruby on Rails, tanto libres y gratuitas como de pago. A continuación se listan las principales:

* Aptana: Multiplataforma. Nació como plugins de eclipse para la edición y desarrollo web. Actualmente puedes instalarlo como plugins o autónomo de forma independiente. Las últimas versiones están muy bien integradas con Ruby on Rails. En este momento Aptana 3 es la versión estable.
* Netbeans: Uno de los más usados, libre y totalmente gratuito. Viene muy bien integrado con JRuby (lo cual es algo lógico pues es un programa de Oracle). Desde NetBeans IDE 7.0, el soporte para Ruby y Ruby on Rails no se encuentra disponible en la distribución estándar del NetBeans IDE.
* TextMate: Sólo para Mac. Es el entorno más usado entre la comunidad Rails. Es de pago pero su potencia y forma de trabajo favorece la producción y desarrollo con Ruby on Rails.
* Gmate: Un proyecto libre y gratuito para convertir Gedit -el editor de texto de escritorio Gnome de GNU/Linux- en un clon muy aproximado de Textmate. Esto se consigue instalando diferentes plugins, temas y retocando algunas opciones. Al ser gratuito es una opción que está cogiendo muchos adeptos hoy en día.
* RubyMine: Entorno de trabajo diseñado exclusivamente para trabajar con Ruby, creado por la compañía Jetbrains.
* Sublime Text: Un editor de texto y editor de código fuente creado en Python desarrollado originalmente como una extensión de Vim, con el tiempo fue creando una identidad propia, por esto aún conserva un modo de edición tipo vi llamado Vintage mode.

Existen otros muchos, sólo es necesario usar algún buscador para encontrar más alternativas.

### Comandos básicos de Ruby on rails

Si quieres empezar un proyecto y ya tienes instalado RoR puedes comenzar con lo siguiente: Abre tu terminal o DOS ve a la carpeta en donde meterás tus archivos y escribe los siguientes comandos:

    1) Crear el proyecto
       rails new prueba
       Se genera una nueva carpeta dentro del directorio en que estás posicionado.
    2) Ubicarse en el directorio recién creado. Ejemplo para plataformas (Windows)
       cd prueba
    3) Crear una tabla Empleados
       rails g scaffold empleado Nombre:string direccion:string telefono:string fechadeEntrada:date
    4) Se migra (se hace corresponder el modelo del programa con una base de datos) con el comando
       rails db:migrate
    5) Desde el terminal se lanza el servidor
       rails s
    6) Listo. Ahora se ingresa a la siguiente dirección en el navegador para utilizar la aplicación ya desarrollada:
       localhost:3000/Empleados
