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 comandosnew
ydb:system:change
derails
.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
yHash
.Eliminar
Rails.application.config.action_dispatch.return_only_request_media_type_on_content_type
obsoleto.Eliminar directivas de política de permisos
speaker
,vibrate
yvr
obsoletas.Eliminar soporte obsoleto para establecer
Rails.application.config.action_dispatch.show_exceptions
entrue
yfalse
.
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
paraassert_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 deActiveRecord::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
eInternalMetadata
como argumentos aActiveRecord::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 argumentorole
.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
aadd_foreign_key
.Eliminar soporte obsoleto para pasar
rewhere
aActiveRecord::Relation#merge
.Eliminar comportamiento obsoleto que revertiría un bloque de transacción cuando se sale usando
return
,break
othrow
.
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
yActiveSupport::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 deArray
,Date
,DateTime
yTime
.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
yActiveSupport::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
aMemCacheStore
.
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
enretry_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.