NO LEAS ESTE ARCHIVO EN GITHUB, LAS GUÍAS ESTÁN PUBLICADAS EN https://guides.rubyonrails.org.

Notas de la versión de Ruby on Rails 7.2

Aspectos destacados en Rails 7.2:

Estas notas de la versión cubren solo los cambios principales. Para aprender sobre varios errores corregidos y cambios, por favor consulta los changelogs o revisa la lista de commits en el repositorio principal de Rails en GitHub.


1 Actualizando a Rails 7.2

Si estás actualizando una aplicación existente, es una gran idea tener una buena cobertura de pruebas antes de empezar. También deberías primero actualizar a Rails 7.1 en caso de que no lo hayas hecho y asegurarte de que tu aplicación sigue funcionando como se espera antes de intentar una actualización a Rails 7.2. Una lista de cosas a tener en cuenta al actualizar está disponible en la guía Actualizando Ruby on Rails.

2 Características Principales

2.1 Configuración de contenedores de desarrollo para aplicaciones

Un contenedor de desarrollo (o contenedor dev para abreviar) te permite usar un contenedor como un entorno de desarrollo completo.

Rails 7.2 añade la capacidad de generar una configuración de contenedor de desarrollo para tu aplicación. Esta configuración incluye una carpeta .devcontainer con un Dockerfile, un archivo docker-compose.yml y un archivo devcontainer.json.

Por defecto, el contenedor dev contiene lo siguiente:

  • Un contenedor Redis para usar con Kredis, Action Cable, etc.
  • Una base de datos (SQLite, Postgres, MySQL o MariaDB)
  • Un contenedor de Chrome sin cabeza para pruebas de sistema
  • Active Storage configurado para usar el disco local y con características de vista previa funcionando

Para generar una nueva aplicación con un contenedor de desarrollo, puedes ejecutar:

$ rails new myapp --devcontainer

Para aplicaciones existentes, ahora está disponible un comando devcontainer:

$ rails devcontainer

Para más información, consulta la guía Comenzando con Contenedores de Desarrollo.

2.2 Añadir guardia de versión de navegador por defecto

Rails ahora añade la capacidad de especificar las versiones de navegador que serán permitidas para acceder a todas las acciones (o algunas, según se limite con only: o except:).

Solo los navegadores que coincidan en el hash o conjunto nombrado pasado a versions: serán bloqueados si están por debajo de las versiones especificadas.

Esto significa que todos los otros navegadores desconocidos, así como los agentes que no estén reportando un encabezado de agente de usuario, tendrán acceso permitido.

Un navegador que esté bloqueado recibirá por defecto el archivo en public/406-unsupported-browser.html con un código de estado HTTP de "406 Not Acceptable".

Ejemplos:

class ApplicationController < ActionController::Base
  # Permitir solo navegadores que soporten nativamente imágenes webp, web push, badges, import maps, CSS nesting + :has
  allow_browser versions: :modern
end

class ApplicationController < ActionController::Base
  # Todas las versiones de Chrome y Opera serán permitidas, pero ninguna versión de "internet explorer" (ie). Safari necesita ser 16.4+ y Firefox 121+.
  allow_browser versions: { safari: 16.4, firefox: 121, ie: false }
end

class MessagesController < ApplicationController
  # Además de los navegadores bloqueados por ApplicationController, también bloquear Opera por debajo de 104 y Chrome por debajo de 119 para la acción show.
  allow_browser versions: { opera: 104, chrome: 119 }, only: :show
end

Las aplicaciones recién generadas tienen esta guardia configurada en ApplicationController.

Para más información, consulta la documentación de allow_browser.

2.3 Hacer de Ruby 3.1 la nueva versión mínima

Hasta ahora, Rails solo eliminaba la compatibilidad con Rubies más antiguos en nuevas versiones mayores. Estamos cambiando esta política porque nos obliga a mantener la compatibilidad con versiones de Ruby que ya no tienen soporte o a aumentar la versión mayor de Rails con más frecuencia, y a eliminar múltiples versiones de Ruby a la vez cuando aumentamos la mayor.

Ahora eliminaremos versiones de Ruby que estén fuera de soporte en versiones menores de Rails en el momento del lanzamiento.

Para Rails 7.2, Ruby 3.1 es la nueva versión mínima.

2.4 Archivos por defecto para Aplicaciones Web Progresivas (PWA)

En preparación para un mejor soporte en la creación de aplicaciones PWA con Rails, ahora generamos archivos PWA por defecto para el manifiesto y el service worker, que se sirven desde app/views/pwa y pueden ser renderizados dinámicamente a través de ERB. Esos archivos se montan explícitamente en la raíz con rutas por defecto en el archivo de rutas generado.

Para más información, consulta el pull request que añade la característica.

2.5 Añadir reglas RuboCop omakase por defecto

Las aplicaciones Rails ahora vienen con RuboCop configurado con un conjunto de reglas de rubocop-rails-omakase por defecto.

Ruby es un lenguaje bellamente expresivo que no solo tolera muchos dialectos diferentes, sino que celebra su diversidad. Nunca fue pensado como un lenguaje para ser escrito exclusivamente en un solo estilo en todas las bibliotecas, frameworks o aplicaciones. Si tú o tu equipo han desarrollado un estilo particular que les trae alegría, deberían atesorarlo.

Esta colección de estilos RuboCop es para aquellos que no se han comprometido con ningún dialecto específico ya. Que les gustaría simplemente tener un punto de partida razonable, y que se beneficiarán de algunas reglas por defecto para al menos comenzar un enfoque consistente al estilo de Ruby.

Estas reglas específicas no son correctas ni incorrectas, sino que simplemente representan las sensibilidades estéticas idiosincráticas del creador de Rails. Úsalas en su totalidad, úsalas como punto de partida, úsalas como inspiración, o como mejor te parezca.

2.6 Añadir flujo de trabajo de CI de GitHub por defecto a nuevas aplicaciones

Rails ahora añade un archivo de flujo de trabajo de CI de GitHub por defecto a nuevas aplicaciones. Esto ayudará especialmente a los recién llegados a comenzar bien con escaneo automatizado, linting y pruebas. Creemos que es una continuación natural para la era moderna de lo que hemos hecho desde el principio con pruebas unitarias.

Por supuesto, es cierto que GitHub Actions es un producto comercial en la nube para repositorios privados después de que hayas usado los tokens gratuitos. Pero dada la relación entre GitHub y Rails, la naturaleza abrumadoramente por defecto de la plataforma para los recién llegados, y el valor de enseñar buenos hábitos de CI a los recién llegados, encontramos que este es un compromiso aceptable.

2.7 Añadir Brakeman por defecto a nuevas aplicaciones

Brakeman es una gran manera de prevenir que vulnerabilidades de seguridad comunes en Rails lleguen a producción.

Las nuevas aplicaciones vienen con Brakeman instalado y combinado con el flujo de trabajo de CI de GitHub, se ejecutará automáticamente en cada push.

2.8 Establecer un nuevo valor por defecto para el recuento de hilos de Puma

Rails cambió el número por defecto de hilos en Puma de 5 a 3.

Debido a la naturaleza de las aplicaciones Rails bien optimizadas, con consultas SQL rápidas y llamadas lentas a terceros ejecutándose a través de trabajos, Ruby puede pasar una cantidad significativa de tiempo esperando que el Global VM Lock (GVL) se libere cuando el recuento de hilos es demasiado alto, lo que perjudica la latencia (tiempo de respuesta de la petición).

Después de una cuidadosa consideración, investigación y basado en la experiencia probada en batalla de aplicaciones que se ejecutan en producción, decidimos que un valor por defecto de 3 hilos es un buen equilibrio entre concurrencia y rendimiento.

Puedes seguir una discusión muy detallada sobre este cambio en el issue.

2.9 Prevenir que los trabajos se programen dentro de transacciones

Un error común con Active Job es encolar trabajos desde dentro de una transacción, lo que hace que potencialmente sean recogidos y ejecutados por otro proceso, antes de que la transacción se comprometa, lo que resulta en varios errores.

Topic.transaction do
  topic = Topic.create

  NewTopicNotificationJob.perform_later(topic)
end

Ahora Active Job automáticamente pospondrá la encolación hasta después de que la transacción se comprometa, y eliminará el trabajo si la transacción se revierte.

Varias implementaciones de cola pueden elegir deshabilitar este comportamiento, y los usuarios pueden deshabilitarlo, o forzarlo en una base por trabajo:

class NewTopicNotificationJob < ApplicationJob
  self.enqueue_after_transaction_commit = :never
end

2.10 Callbacks de commit y rollback por transacción

Esto ahora es posible gracias a una nueva característica que permite registrar callbacks de transacción fuera de un registro.

ActiveRecord::Base.transaction ahora cede un objeto ActiveRecord::Transaction, que permite registrar callbacks en él.

Article.transaction do |transaction|
  article.update(published: true)

  transaction.after_commit do
    PublishNotificationMailer.with(article: article).deliver_later
  end
end

También se añadió ActiveRecord::Base.current_transaction para permitir registrar callbacks en él.

Article.current_transaction.after_commit do
  PublishNotificationMailer.with(article: article).deliver_later
end

Y finalmente, se añadió ActiveRecord.after_all_transactions_commit, para el código que puede ejecutarse dentro o fuera de una transacción y necesita realizar trabajo después de que los cambios de estado se hayan persistido adecuadamente.

def publish_article(article)
  article.update(published: true)

  ActiveRecord.after_all_transactions_commit do
    PublishNotificationMailer.with(article: article).deliver_later
  end
end

Consulta #51474 y #51426 para más información:

2.11 Habilitar YJIT por defecto si se ejecuta Ruby 3.3+

YJIT es el compilador JIT de Ruby que está disponible en CRuby desde Ruby 3.1. Puede proporcionar mejoras significativas en el rendimiento para aplicaciones Rails, ofreciendo mejoras de latencia del 15-25%.

En Rails 7.2, YJIT está habilitado por defecto si se ejecuta Ruby 3.3 o más reciente.

Puedes deshabilitar YJIT configurando:

Rails.application.config.yjit = false

2.12 Nuevo diseño para las guías de Rails

Cuando Rails 7.0 aterrizó en diciembre de 2021, vino con una nueva página de inicio y una nueva pantalla de inicio. El diseño de las guías, sin embargo, ha permanecido en gran medida sin cambios desde 2009, un punto que no ha pasado desapercibido (escuchamos tus comentarios).

Con todo el trabajo que se está realizando ahora para eliminar la complejidad del framework Rails y hacer la documentación consistente, clara y actualizada, era hora de abordar el diseño de las guías y hacerlas igualmente modernas, simples y frescas.

Trabajamos con el diseñador UX John Athayde para tomar el aspecto y sensación de la página de inicio y transferirlo a las guías de Rails para hacerlas limpias, elegantes y actualizadas.

El diseño permanecerá igual, pero desde hoy verás los siguientes cambios reflejados en las guías:

  • Diseño más limpio y menos recargado.
  • Fuentes, esquema de color y logotipo más consistentes con la página de inicio.
  • Iconografía actualizada.
  • Navegación simplificada.
  • Barra de navegación "Capítulos" pegajosa al desplazarse.

Consulta el anuncio en el blog para algunas imágenes de antes/después.

2.13 Configurar jemalloc en el Dockerfile por defecto para optimizar la asignación de memoria

El uso de malloc por parte de Ruby puede crear problemas de fragmentación de memoria, especialmente al usar múltiples hilos como lo hace Puma. Cambiar a un asignador que use patrones diferentes para evitar la fragmentación puede disminuir el uso de memoria por un margen sustancial.

Rails 7.2 ahora incluye jemalloc en el Dockerfile por defecto para optimizar la asignación de memoria.

2.14 Sugerir configuración de puma-dev en bin/setup

Puma-dev es el camino dorado para desarrollar múltiples aplicaciones Rails localmente, si no estás usando Docker.

Rails ahora sugiere cómo configurar eso en un nuevo comentario que encontrarás en bin/setup.

3 Railties

Por favor consulta el Changelog para cambios detallados.

3.1 Eliminaciones

  • Eliminar Rails::Generators::Testing::Behaviour obsoleto.

  • Eliminar Rails.application.secrets obsoleto.

  • Eliminar Rails.config.enable_dependency_loading obsoleto.

  • Eliminar el asistente de consola find_cmd_and_exec obsoleto.

  • Eliminar soporte para adaptadores de base de datos específicos de oracle, sqlserver y JRuby de los comandos new y db:system:change de rails.

  • Eliminar la opción config.public_file_server.enabled de los generadores.

3.2 Deprecaciones

3.3 Cambios notables

  • Añadir RuboCop con reglas de rubocop-rails-omakase por defecto tanto en nuevas aplicaciones como en plugins.

  • Añadir Brakeman con configuración por defecto para comprobaciones de seguridad en nuevas aplicaciones.

  • Añadir archivos de CI de GitHub para Dependabot, Brakeman, RuboCop y ejecución de pruebas por defecto para nuevas aplicaciones y plugins.

  • YJIT ahora está habilitado por defecto para nuevas aplicaciones que se ejecutan en Ruby 3.3+.

  • Generar una carpeta .devcontainer para ejecutar la aplicación en un contenedor con Visual Studio Code.

    $ rails new myapp --devcontainer
    
  • Introducir Rails::Generators::Testing::Assertions#assert_initializer para probar inicializadores.

  • Las pruebas de sistema ahora usan Chrome sin cabeza por defecto para nuevas aplicaciones.

  • Soportar la variable de entorno BACKTRACE para desactivar la limpieza de backtrace en ejecuciones normales del servidor. Anteriormente, esto solo estaba disponible para pruebas.

  • Añadir archivos por defecto para Aplicaciones Web Progresivas (PWA) para el manifiesto y service worker, servidos desde app/views/pwa, y hacerlos renderizables dinámicamente a través de ERB.

4 Action Cable

Por favor consulta el Changelog para cambios detallados.

4.1 Eliminaciones

4.2 Deprecaciones

4.3 Cambios notables

5 Action Pack

Por favor consulta el Changelog para cambios detallados.

5.1 Eliminaciones

  • Eliminar constante ActionDispatch::IllegalStateError obsoleta.

  • Eliminar constante AbstractController::Helpers::MissingHelperError obsoleta.

  • Eliminar comparación obsoleta entre ActionController::Parameters y Hash.

  • Eliminar Rails.application.config.action_dispatch.return_only_request_media_type_on_content_type obsoleto.

  • Eliminar directivas de política de permisos speaker, vibrate y vr obsoletas.

  • Eliminar soporte obsoleto para establecer Rails.application.config.action_dispatch.show_exceptions en true y false.

5.2 Deprecaciones

  • Deprecar Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality.

5.3 Cambios notables

6 Action View

Por favor consulta el Changelog para cambios detallados.

6.1 Eliminaciones

  • Eliminar @rails/ujs obsoleto a favor de Turbo.

6.2 Deprecaciones

  • Deprecar pasar contenido a elementos vacíos al usar constructores de etiquetas tipo tag.br.

6.3 Cambios notables

7 Action Mailer

Por favor consulta el Changelog para cambios detallados.

7.1 Eliminaciones

  • Eliminar config.action_mailer.preview_path obsoleto.

  • Eliminar parámetros obsoletos vía :args para assert_enqueued_email_with.

7.2 Deprecaciones

7.3 Cambios notables

8 Active Record

Por favor consulta el Changelog para cambios detallados.

8.1 Eliminaciones

  • Eliminar Rails.application.config.active_record.suppress_multiple_database_warning obsoleto.

  • Eliminar soporte obsoleto para llamar alias_attribute con nombres de atributo inexistentes.

  • Eliminar argumento name obsoleto de ActiveRecord::Base.remove_connection.

  • Eliminar ActiveRecord::Base.clear_active_connections! obsoleto.

  • Eliminar ActiveRecord::Base.clear_reloadable_connections! obsoleto.

  • Eliminar ActiveRecord::Base.clear_all_connections! obsoleto.

  • Eliminar ActiveRecord::Base.flush_idle_connections! obsoleto.

  • Eliminar ActiveRecord::ActiveJobRequiredError obsoleto.

  • Eliminar soporte obsoleto para definir explain en el adaptador de conexión con 2 argumentos.

  • Eliminar método ActiveRecord::LogSubscriber.runtime obsoleto.

  • Eliminar método ActiveRecord::LogSubscriber.runtime= obsoleto.

  • Eliminar método ActiveRecord::LogSubscriber.reset_runtime obsoleto.

  • Eliminar método ActiveRecord::Migration.check_pending! obsoleto.

  • Eliminar soporte obsoleto para pasar las clases SchemaMigration e InternalMetadata como argumentos a ActiveRecord::MigrationContext.

  • Eliminar comportamiento obsoleto para soportar referirse a una asociación singular por su nombre plural.

  • Eliminar TestFixtures.fixture_path obsoleto.

  • Eliminar soporte obsoleto para ActiveRecord::Base#read_attribute(:id) para devolver el valor de clave primaria personalizado.

  • Eliminar soporte obsoleto para pasar coder y clase como segundo argumento a serialize.

  • Eliminar #all_foreign_keys_valid? obsoleto de los adaptadores de base de datos.

  • Eliminar ActiveRecord::ConnectionAdapters::SchemaCache.load_from obsoleto.

  • Eliminar ActiveRecord::ConnectionAdapters::SchemaCache#data_sources obsoleto.

  • Eliminar #all_connection_pools obsoleto.

  • Eliminar soporte obsoleto para aplicar #connection_pool_list, #active_connections?, #clear_active_connections!, #clear_reloadable_connections!, #clear_all_connections! y #flush_idle_connections! a las conexiones de los pools para el rol actual cuando no se proporciona el argumento role.

  • Eliminar ActiveRecord::ConnectionAdapters::ConnectionPool#connection_klass obsoleto.

  • Eliminar #quote_bound_value obsoleto.

  • Eliminar soporte obsoleto para citar ActiveSupport::Duration.

  • Eliminar soporte obsoleto para pasar deferrable: true a add_foreign_key.

  • Eliminar soporte obsoleto para pasar rewhere a ActiveRecord::Relation#merge.

  • Eliminar comportamiento obsoleto que revertiría un bloque de transacción cuando se sale usando return, break o throw.

8.2 Deprecaciones

  • Deprecar Rails.application.config.active_record.allow_deprecated_singular_associations_name

  • Deprecar Rails.application.config.active_record.commit_transaction_on_non_local_return

8.3 Cambios notables

9 Active Storage

Por favor consulta el Changelog para cambios detallados.

9.1 Eliminaciones

  • Eliminar config.active_storage.replace_on_assign_to_many obsoleto.

  • Eliminar config.active_storage.silence_invalid_content_types_warning obsoleto.

9.2 Deprecaciones

9.3 Cambios notables

10 Active Model

Por favor consulta el Changelog para cambios detallados.

10.1 Eliminaciones

10.2 Deprecaciones

10.3 Cambios notables

11 Active Support

Por favor consulta el Changelog para cambios detallados.

11.1 Eliminaciones

  • Eliminar ActiveSupport::Notifications::Event#children y ActiveSupport::Notifications::Event#parent_of? obsoletos.

  • Eliminar soporte obsoleto para llamar a los siguientes métodos sin pasar un deprecador:

    • deprecate
    • deprecate_constant
    • ActiveSupport::Deprecation::DeprecatedObjectProxy.new
    • ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new
    • ActiveSupport::Deprecation::DeprecatedConstantProxy.new
    • assert_deprecated
    • assert_not_deprecated
    • collect_deprecations
  • Eliminar delegación de ActiveSupport::Deprecation a instancia obsoleta.

  • Eliminar SafeBuffer#clone_empty obsoleto.

  • Eliminar #to_default_s obsoleto de Array, Date, DateTime y Time.

  • Eliminar opciones :pool_size y :pool_timeout obsoletas para el almacenamiento en caché.

  • Eliminar soporte obsoleto para config.active_support.cache_format_version = 6.1.

  • Eliminar constantes ActiveSupport::LogSubscriber::CLEAR y ActiveSupport::LogSubscriber::BOLD obsoletas.

  • Eliminar soporte obsoleto para resaltar texto de registro con booleano posicional en ActiveSupport::LogSubscriber#color.

  • Eliminar config.active_support.disable_to_s_conversion obsoleto.

  • Eliminar config.active_support.remove_deprecated_time_with_zone_name obsoleto.

  • Eliminar config.active_support.use_rfc4122_namespaced_uuids obsoleto.

  • Eliminar soporte obsoleto para pasar instancias Dalli::Client a MemCacheStore.

11.2 Deprecaciones

11.3 Cambios notables

12 Active Job

Por favor consulta el Changelog para cambios detallados.

12.1 Eliminaciones

  • Eliminar serializador primitivo para argumentos BigDecimal obsoleto.

  • Eliminar soporte obsoleto para establecer valores numéricos en el atributo scheduled_at.

  • Eliminar valor :exponentially_longer obsoleto para :wait en retry_on.

12.2 Deprecaciones

  • Deprecar Rails.application.config.active_job.use_big_decimal_serialize.

12.3 Cambios notables

13 Action Text

Por favor consulta el Changelog para cambios detallados.

13.1 Eliminaciones

13.2 Deprecaciones

13.3 Cambios notables

14 Action Mailbox

Por favor consulta el Changelog para cambios detallados.

14.1 Eliminaciones

14.2 Deprecaciones

14.3 Cambios notables

15 Guías de Ruby on Rails

Por favor consulta el Changelog para cambios detallados.

15.1 Cambios notables

16 Créditos

Consulta la lista completa de contribuyentes a Rails por las muchas personas que dedicaron muchas horas a hacer de Rails el framework estable y robusto que es. Kudos a todos ellos.


Comentarios

Se te anima a ayudar a mejorar la calidad de esta guía.

Por favor contribuye si ves algún error tipográfico o errores fácticos. Para comenzar, puedes leer nuestra sección de contribuciones a la documentación.

También puedes encontrar contenido incompleto o cosas que no están actualizadas. Por favor agrega cualquier documentación faltante para main. Asegúrate de revisar Guías Edge primero para verificar si los problemas ya están resueltos o no en la rama principal. Revisa las Guías de Ruby on Rails para estilo y convenciones.

Si por alguna razón detectas algo que corregir pero no puedes hacerlo tú mismo, por favor abre un issue.

Y por último, pero no menos importante, cualquier tipo de discusión sobre la documentación de Ruby on Rails es muy bienvenida en el Foro oficial de Ruby on Rails.