Ruby on Rails (simplificado como Rails ) es un marco de trabajo de aplicaciones web del lado del servidor escrito en Ruby bajo la licencia MIT . Rails es un marco de trabajo modelo-vista-controlador (MVC), que proporciona estructuras predeterminadas para una base de datos , un servicio web y páginas web . Fomenta y facilita el uso de estándares web como JSON o XML para la transferencia de datos y HTML , CSS y JavaScript para la interfaz de usuario. Además de MVC, Rails enfatiza el uso de otros patrones y paradigmas de ingeniería de software conocidos , incluidos la convención sobre configuración (CoC), no repetirse (DRY) y el patrón de registro activo . [4]
La aparición de Ruby on Rails en 2005 influyó enormemente en el desarrollo de aplicaciones web, a través de características innovadoras como creaciones de tablas de bases de datos sin problemas, migraciones y andamiaje de vistas para permitir el desarrollo rápido de aplicaciones. La influencia de Ruby on Rails en otros marcos web sigue siendo evidente hoy en día, con muchos marcos en otros lenguajes que toman prestadas sus ideas, incluidos Django en Python ; Catalyst en Perl ; Laravel , CakePHP y Yii en PHP ; Grails en Groovy ; Phoenix en Elixir ; Play en Scala ; y Sails.js en Node.js.
Los sitios conocidos que utilizan Ruby on Rails incluyen Airbnb , Crunchbase , Dribbble , [5] GitHub , [6] Twitch [7] y Shopify .
David Heinemeier Hansson extrajo Ruby on Rails de su trabajo en la herramienta de gestión de proyectos Basecamp en la empresa de aplicaciones web 37signals . [8] Hansson lanzó por primera vez Rails como código abierto en julio de 2004, pero no compartió los derechos de confirmación del proyecto hasta febrero de 2005. [ cita requerida ] En agosto de 2006, el marco alcanzó un hito cuando Apple anunció que enviaría Ruby on Rails con Mac OS X v10.5 "Leopard" , [9] que se lanzó en octubre de 2007.
La versión 2.3 de Rails se lanzó el 15 de marzo de 2009, con importantes novedades en plantillas, motores, Rack y formularios de modelos anidados. Las plantillas permiten al desarrollador generar una aplicación de esqueleto con gemas y configuraciones personalizadas. Los motores ofrecen a los desarrolladores la capacidad de reutilizar partes de la aplicación completas con rutas, rutas de visualización y modelos. La interfaz de servidor web de Rack y Metal permiten escribir fragmentos de código optimizados que se enrutan alrededor de Action Controller. [10]
El 23 de diciembre de 2008, se lanzó Merb , otro marco de trabajo para aplicaciones web, y Ruby on Rails anunció que trabajaría con el proyecto Merb para incorporar "las mejores ideas de Merb" a Rails 3, poniendo fin a la "duplicación innecesaria" entre ambas comunidades. [11] Merb se fusionó con Rails como parte del lanzamiento de Rails 3.0. [12] [13]
Rails 3.1 se lanzó el 31 de agosto de 2011, presentando migraciones de bases de datos reversibles, canalización de activos, streaming, jQuery como biblioteca de JavaScript predeterminada y las nuevas versiones de CoffeeScript y Sass . [14]
Rails 3.2 se lanzó el 20 de enero de 2012 con un modo de desarrollo más rápido y un motor de enrutamiento (también conocido como motor Journey), explicación automática de consultas y registro etiquetado. [15] Rails 3.2.x es la última versión que admite Ruby 1.8.7. [16] Rails 3.2.12 admite Ruby 2.0. [17]
Rails 4.0 se lanzó el 25 de junio de 2013, introduciendo Russian Doll Caching, Turbolinks, Live Streaming y haciendo que Active Resource, Active Record Observer y otros componentes sean opcionales al dividirlos como gemas. [18]
Rails 4.1 se lanzó el 8 de abril de 2014, presentando Spring, variantes, enumeraciones, vistas previas de Mailer y secrets.yml. [19]
Rails 4.2 se lanzó el 19 de diciembre de 2014, presentando Active Job, correos electrónicos asincrónicos, Adequate Record, Web Console y claves externas . [20]
Rails 5.0 se lanzó el 30 de junio de 2016, presentando Action Cable, el modo API y Turbolinks 5. [21]
Rails 5.0.0.1 se lanzó el 10 de agosto de 2016, con uso exclusivo de Rails CLI sobre Rake y soporte para Ruby versión 2.2.2 y superiores.
Rails 5.1 se lanzó el 27 de abril de 2017, introduciendo cambios en la integración de JavaScript (administración de dependencias de JavaScript desde NPM a través de Yarn, compilación opcional de JavaScript usando Webpack y una reescritura de Rails UJS para usar JavaScript original en lugar de depender de jQuery), pruebas del sistema usando Capybara , secretos encriptados, correos parametrizados, rutas directas y resueltas, y un ayudante form_with unificado que reemplaza a los ayudantes form_tag/form_for. [22]
Rails 5.2 se lanzó el 9 de abril de 2018 e introdujo nuevas características que incluyen ActiveStorage, Redis Cache Store integrado, credenciales Rails actualizadas y un nuevo DSL que permite configurar una política de seguridad de contenido para una aplicación. [23]
Rails 5.2.2 se lanzó el 4 de diciembre de 2018 e introdujo numerosas correcciones de errores y varias mejoras lógicas. [24]
Rails 6.0 se lanzó el 16 de agosto de 2019, convirtiendo a Webpack en el predeterminado, agregando enrutamiento de buzones de correo, un editor de texto enriquecido en línea predeterminado , pruebas paralelas, soporte para múltiples bases de datos, enrutamiento de correo y un nuevo cargador automático. [25]
Rails 6.1 se lanzó el 9 de diciembre de 2020 y agregó conmutación de conexión por base de datos, fragmentación horizontal de la base de datos , carga ansiosa de todas las asociaciones, tipos delegados como alternativa a la herencia de una sola tabla, eliminación asincrónica de asociaciones, objetos de error y otras mejoras y correcciones de errores. [26]
Rails 7.0 se lanzó el 15 de diciembre de 2021, reemplazando Node.js y Webpack con mapas de importación para la administración de JavaScript de forma predeterminada, reemplazando Turbolinks con una combinación de Turbo y Stimulus, agregando cifrado en el trabajo en Active Record, usando Zeitwerk exclusivamente para la carga de código y más. [27]
Rails 7.1 se lanzó el 5 de octubre de 2023, Dockerfiles admite el uso de Kamal para implementar su aplicación, mejoras de autenticación y ahora incluye soporte para bun . [28]
En octubre de 2024 se instituyó una política de mantenimiento revisada [48]. [49]
Ruby on Rails evoluciona radicalmente de una versión a otra, explorando el uso de nuevas tecnologías y adoptando nuevos estándares en Internet. Algunas características son muy estables en Ruby on Rails, mientras que otras se reemplazan en favor de nuevas técnicas.
El patrón modelo-vista-controlador (MVC) es la estructura fundamental para organizar la programación de aplicaciones.
En una configuración predeterminada, un modelo en el marco de Ruby on Rails se asigna a una tabla en una base de datos y a un archivo Ruby. Por ejemplo, una clase de modelo User normalmente se definirá en el archivo 'user.rb' en el directorio app/models y se vinculará a la tabla 'users' en la base de datos. Si bien los desarrolladores tienen la libertad de ignorar esta convención y elegir nombres diferentes para sus modelos, archivos y tabla de base de datos, esto no es una práctica común y generalmente se desaconseja de acuerdo con la filosofía de " convención sobre configuración ". [50]
Un controlador es un componente del lado del servidor de Rails que responde a las solicitudes externas del servidor web a la aplicación, determinando qué archivo de vista se debe representar. El controlador también puede tener que consultar uno o más modelos para obtener información y pasarlos a la vista. Por ejemplo, en un sistema de reservas de aerolíneas, un controlador que implemente una función de búsqueda de vuelos necesitaría consultar un modelo que represente vuelos individuales para encontrar vuelos que coincidan con la búsqueda, y también podría necesitar consultar modelos que representen aeropuertos y aerolíneas para encontrar datos secundarios relacionados. El controlador podría luego pasar un subconjunto de los datos del vuelo a la vista correspondiente, que contendría una mezcla de HTML estático y lógica que usa los datos del vuelo para crear un documento HTML que contiene una tabla con una fila por vuelo. Un controlador puede proporcionar una o más acciones. En Ruby on Rails, una acción es típicamente una unidad básica que describe cómo responder a una solicitud externa específica del navegador web. Además, tenga en cuenta que el controlador/acción será accesible para solicitudes web externas solo si se le asigna una ruta correspondiente. Rails alienta a los desarrolladores a utilizar rutas RESTful , que incluyen acciones como crear, crear, editar, actualizar, destruir, mostrar e indexar. Estas asignaciones de solicitudes/rutas entrantes a acciones del controlador se pueden configurar fácilmente en el archivo de configuración route.rb.
Una vista en la configuración predeterminada de Rails es un archivo erb , que se evalúa y se convierte a HTML en tiempo de ejecución. Alternativamente, se pueden utilizar muchos otros sistemas de plantillas para las vistas. [ cita requerida ]
Ruby on Rails incluye herramientas que facilitan las tareas de desarrollo habituales de forma inmediata, como el andamiaje que puede construir automáticamente algunos de los modelos y vistas necesarios para un sitio web básico . [51] También se incluyen WEBrick , un servidor web Ruby simple que se distribuye con Ruby, y Rake , un sistema de compilación, distribuido como una gema . Junto con Ruby on Rails, estas herramientas proporcionan un entorno de desarrollo básico. [ cita requerida ]
Ruby on Rails no suele estar conectado a Internet directamente, sino a través de algún servidor web front-end . Mongrel fue generalmente preferido [¿ por quién? ] sobre WEBrick en los primeros días, [ cita requerida ] pero también puede ejecutarse en Lighttpd , Apache , Cherokee , Hiawatha , Nginx (ya sea como un módulo – Phusion Passenger por ejemplo – o a través de CGI , FastCGI o mod ruby ), y muchos otros. A partir de 2008, Passenger reemplazó a Mongrel como el servidor web más utilizado para Ruby on Rails. [52] Ruby también es compatible de forma nativa con IBM i . [53]
Ruby on Rails también es notable por su uso extensivo de las bibliotecas JavaScript Prototype y Script.aculo.us para la creación de scripts de acciones Ajax . [54] Ruby on Rails 3.0 separa el marcado de la página (que define la estructura de la página) de la creación de scripts (que determina la funcionalidad o lógica de la página). A partir de la versión 7.0, las nuevas aplicaciones Ruby on Rails vienen con la familia Hotwire de bibliotecas JavaScript instaladas de forma predeterminada.
Desde la versión 2.0, Ruby on Rails ofrece tanto HTML como XML como formatos de salida estándar. Este último es el formato para servicios web RESTful.
Rails 3.1 introdujo Sass como plantilla CSS estándar .
De forma predeterminada, el servidor utiliza Ruby embebido en las vistas HTML, y los archivos tienen la extensión html.erb. Rails admite el intercambio de lenguajes de plantillas alternativos, como HAML y Mustache .
Ruby on Rails 3.0 ha sido diseñado para funcionar con Ruby 1.8.7, Ruby 1.9.2 y JRuby 1.5.2+; las versiones anteriores no son compatibles. [55]
Ruby on Rails 3.2 es la última serie de versiones que soportan Ruby 1.8.7.
Ruby on Rails se divide en varios paquetes, a saber, ActiveRecord (un sistema de mapeo relacional de objetos para el acceso a bases de datos), Action Pack, Active Support y Action Mailer. Antes de la versión 2.0, Ruby on Rails también incluía el paquete Action Web Service, que ahora ha sido reemplazado por Active Resource. Además de los paquetes estándar, los desarrolladores pueden crear complementos para ampliar los paquetes existentes. En versiones anteriores, Rails admitía complementos dentro de su propio marco personalizado; la versión 3.2 los deja obsoletos en favor de las "gemas" estándar de Ruby. [56]
Ruby on Rails suele instalarse mediante RubyGems , un gestor de paquetes [57] que se incluye con las versiones actuales de Ruby. Muchos sistemas gratuitos similares a Unix también admiten la instalación de Ruby on Rails y sus dependencias a través de su sistema de gestión de paquetes nativo .
Ruby on Rails normalmente se implementa con un servidor de base de datos como MySQL o PostgreSQL y un servidor web como Apache que ejecuta el módulo Phusion Passenger .
Ruby on Rails tiene como objetivo enfatizar la Convención sobre Configuración (CoC) y el principio No Repetir Usted Mismo (DRY).
La Doctrina Rails es un facilitador duradero que guía la filosofía, el diseño y la implementación del marco Ruby on Rails.
"Convención sobre configuración" significa que un desarrollador solo necesita especificar aspectos no convencionales de la aplicación. Por ejemplo, si hay una clase Venta en el modelo, la tabla correspondiente en la base de datos se llama ventas de manera predeterminada. Solo si uno se desvía de esta convención, como llamar a la tabla "productos vendidos", el desarrollador necesita escribir código con respecto a estos nombres. En general, las convenciones de Ruby on Rails dan como resultado menos código y menos repeticiones. [58]
"No repetirse" significa que la información se encuentra en un único lugar, sin ambigüedades. Por ejemplo, al utilizar el módulo ActiveRecord de Rails, el desarrollador no necesita especificar los nombres de las columnas de la base de datos en las definiciones de clase. En cambio, Ruby on Rails puede recuperar esta información de la base de datos basándose en el nombre de la clase.
"Modelos gordos, controladores delgados" significa que la mayor parte de la lógica de la aplicación debe ubicarse dentro del modelo, dejando el controlador lo más liviano posible.
HTML Over The Wire (Hotwire), [59] [60] La compresión conceptual, [61] [62] y la seguridad robusta [63] marcan el enfoque de Rails 7.0 para el marco de una sola persona. [a]
En marzo de 2007, David Heinemeier Hansson solicitó el registro de tres marcas comerciales relacionadas con Ruby on Rails ante la USPTO . Estas solicitudes se refieren a la frase "RUBY ON RAILS", [65] la palabra "RAILS", [66] y el logotipo oficial de Rails. [67] En el verano de 2007, Hansson negó a la editorial Apress el permiso para utilizar el logotipo de Ruby on Rails en la portada de un nuevo libro de Ruby on Rails escrito por algunos miembros de la comunidad con autoridad. El episodio dio lugar a una protesta educada en la comunidad de Ruby on Rails. [68] [69] En respuesta a esta crítica, Hansson respondió:
Sólo concedo el uso promocional [del logotipo de Rails] para productos en los que participo directamente, como libros en cuyo proceso de desarrollo participé o conferencias en cuya ejecución participé. Sin duda, intentaré hacer valer todas las marcas registradas de Rails. [68]
La marca registrada del logotipo fue cancelada el 25 de octubre de 2019. [67]
En el pasado, Rails que se ejecutaba en el intérprete Ruby de Matz (el intérprete de referencia de facto para Ruby) había sido criticado por problemas de escalabilidad. [70] Estos críticos a menudo mencionaron varias interrupciones de Twitter en 2007 y 2008, que impulsaron la transición parcial de Twitter a Scala (que se ejecuta en la máquina virtual Java ) para su sistema de colas y otro middleware . [71] [72] Los aspectos de la interfaz de usuario del sitio continuaron ejecutando Ruby on Rails [73] hasta 2011, cuando fue reemplazado debido a preocupaciones sobre el rendimiento. [74] Por otro lado, muchos desarrolladores de aplicaciones comerciales Rails confiaron en el diseño de la arquitectura del sistema, incluidas las opciones de motor de base de datos, configuración de caché y servidores, para abordar los problemas de escalabilidad. El autor original de Rails, David Heinemeier Hansson, criticó a Twitter, diciendo que sus problemas de escalabilidad eran consecuencia de sus propias malas decisiones arquitectónicas y no culpa de Rails. Según Hansson, culpar a Rails por sus problemas sin hacer ninguna contribución al marco es ingrato e injusto. [75]
En 2011, Gartner Research señaló que, a pesar de las críticas y comparaciones con Java, muchas empresas web de consumo de alto perfil están utilizando Ruby on Rails para crear aplicaciones web escalables. Algunos de los sitios más grandes que ejecutan Ruby on Rails incluyen Airbnb , Cookpad , GitHub , GitLab , [76] Scribd , Shopify y Basecamp . [77] A partir de enero de 2016, se estima que más de 1,2 millones de sitios web ejecutan Ruby on Rails. [78] [79]
En marzo de 2012, el investigador de seguridad Egor Homakov descubrió una vulnerabilidad de asignación masiva que permitía explotar de forma remota ciertas aplicaciones Rails, y lo demostró hackeando GitHub sin malas intenciones después de que sus intentos anteriores de divulgación responsable fueran rechazados. [80]
El 24 de septiembre de 2013, se informó de una falla de seguridad en la persistencia de cookies de sesión en Ruby on Rails. En una configuración predeterminada, el hash de sesión completo se almacena dentro de una cookie de sesión conocida como CookieStore , lo que permite que cualquier sesión autenticada que posea la cookie de sesión inicie sesión como el usuario de destino en cualquier momento en el futuro. Como solución alternativa, se recomienda a los administradores configurar las cookies para que se almacenen en el servidor utilizando mecanismos como ActiveRecordStore . [81]
Los investigadores Daniel Jackson y Joseph Near desarrollaron un depurador de datos al que llamaron "Space", que puede analizar el acceso a los datos de un programa Rails y determinar si el programa cumple adecuadamente las reglas sobre restricciones de acceso. El 15 de abril de 2016, Near informó que un análisis de 50 aplicaciones web populares que utilizaban Space descubrió 23 fallas de seguridad previamente desconocidas. [82]
Rails 3.0 ha sido diseñado para funcionar con Ruby 1.8.7, Ruby 1.9.2 y JRuby 1.5.2+.
Ejecutar en Rails nos ha obligado a lidiar con problemas de escalabilidad (problemas con los que cualquier sitio en crecimiento eventualmente se enfrenta) mucho antes de lo que creo que lo haríamos con otro marco.
Teníamos un sistema de colas basado en Ruby que utilizábamos para comunicarnos entre los front-end de Rails y los daemons, y terminamos reemplazándolo por uno escrito en Scala. El de Ruby funcionaba bastante bien en un estado estable normal, pero el tiempo de inicio y el comportamiento de bloqueo no eran deseables.
dijo Payne, Twitter espera tener toda su infraestructura de middleware y sus API trasladadas al nuevo lenguaje. Ruby se mantendrá, pero solo en el front-end. "Seguimos contentos con Rails para crear funciones orientadas al usuario... en cuanto al rendimiento, está bien para las personas que hacen clic en las páginas web. Es el tipo de trabajo pesado, el procesamiento asincrónico del que nos hemos alejado".
Usamos Scala para algunas cosas en Twitter, pero la mayor parte del sitio está en Ruby.