NO LEA 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.1

Aspectos destacados en Rails 7.1:

Estas notas de la versión cubren solo los cambios principales. Para conocer varias correcciones de errores y cambios, consulte los registros de cambios o vea la lista de commits en el repositorio principal de Rails en GitHub.


1 Actualización a Rails 7.1

Si está actualizando una aplicación existente, es una buena idea tener una buena cobertura de pruebas antes de comenzar. También debe primero actualizar a Rails 7.0 en caso de que no lo haya hecho y asegurarse de que su aplicación aún funcione como se espera antes de intentar una actualización a Rails 7.1. Una lista de cosas a tener en cuenta al actualizar está disponible en la guía Actualización de Ruby on Rails.

2 Características principales

2.1 Generar Dockerfiles para nuevas aplicaciones Rails

Soporte Docker por defecto para nuevas aplicaciones Rails. Al generar una nueva aplicación, Rails ahora incluirá archivos relacionados con Docker en la aplicación.

Estos archivos sirven como una configuración fundamental para desplegar su aplicación Rails en un entorno de producción utilizando Docker. Es importante tener en cuenta que estos archivos no están destinados para propósitos de desarrollo.

Aquí hay un ejemplo rápido de cómo construir y ejecutar su aplicación Rails usando estos archivos Docker:

$ docker build -t app .
$ docker volume create app-storage
$ docker run --rm -it -v app-storage:/rails/storage -p 3000:3000 --env RAILS_MASTER_KEY=<su-clave-maestra-de-configuración> app

También puede iniciar una consola o corredor desde esta imagen Docker:

$ docker run --rm -it -v app-storage:/rails/storage --env RAILS_MASTER_KEY=<su-clave-maestra-de-configuración> app console

Para aquellos que buscan crear una imagen multiplataforma (por ejemplo, Apple Silicon para despliegue AMD o Intel) y subirla a Docker Hub, siga estos pasos:

$ docker login -u <su-usuario>
$ docker buildx create --use
$ docker buildx build --push --platform=linux/amd64,linux/arm64 -t <su-usuario/nombre-de-imagen> .

Esta mejora simplifica el proceso de despliegue, proporcionando un punto de partida conveniente para poner en funcionamiento su aplicación Rails en un entorno de producción.

2.2 Añadir ActiveRecord::Base.normalizes

ActiveRecord::Base.normalizes declara una normalización de atributo. La normalización se aplica cuando el atributo se asigna o actualiza, y el valor normalizado se guardará en la base de datos. La normalización también se aplica al argumento de palabra clave correspondiente de los métodos de consulta, permitiendo que los registros se consulten usando valores no normalizados.

Por ejemplo:

class User < ActiveRecord::Base
  normalizes :email, with: -> email { email.strip.downcase }
  normalizes :phone, with: -> phone { phone.delete("^0-9").delete_prefix("1") }
end

user = User.create(email: " CRUISE-CONTROL@EXAMPLE.COM\n")
user.email                  # => "cruise-control@example.com"

user = User.find_by(email: "\tCRUISE-CONTROL@EXAMPLE.COM ")
user.email                  # => "cruise-control@example.com"
user.email_before_type_cast # => "cruise-control@example.com"

User.where(email: "\tCRUISE-CONTROL@EXAMPLE.COM ").count         # => 1
User.where(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]).count # => 0

User.exists?(email: "\tCRUISE-CONTROL@EXAMPLE.COM ")         # => true
User.exists?(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]) # => false

User.normalize_value_for(:phone, "+1 (555) 867-5309") # => "5558675309"

2.3 Añadir ActiveRecord::Base.generates_token_for

ActiveRecord::Base.generates_token_for define la generación de tokens para un propósito específico. Los tokens generados pueden expirar y también pueden incluir datos del registro. Al usar un token para obtener un registro, los datos del token y los datos actuales del registro serán comparados. Si los dos no coinciden, el token será tratado como inválido, igual que si hubiera expirado.

Aquí hay un ejemplo implementando un token de restablecimiento de contraseña de un solo uso:

class User < ActiveRecord::Base
  has_secure_password

  generates_token_for :password_reset, expires_in: 15.minutes do
    # `password_salt` (definido por `has_secure_password`) devuelve la sal para
    # la contraseña. La sal cambia cuando se cambia la contraseña, por lo que el token
    # expirará cuando se cambie la contraseña.
    password_salt&.last(10)
  end
end

user = User.first
token = user.generate_token_for(:password_reset)

User.find_by_token_for(:password_reset, token) # => user

user.update!(password: "nueva contraseña")
User.find_by_token_for(:password_reset, token) # => nil

2.4 Añadir perform_all_later para encolar múltiples trabajos a la vez

El método perform_all_later en Active Job, diseñado para agilizar el proceso de encolar múltiples trabajos simultáneamente. Esta poderosa adición le permite encolar trabajos de manera eficiente sin activar callbacks. Esto es particularmente útil cuando necesita encolar un lote de trabajos a la vez, reduciendo la sobrecarga de múltiples idas y vueltas al almacén de colas.

Así es como puede aprovechar perform_all_later:

# Encolando trabajos individuales
ActiveJob.perform_all_later(MyJob.new("hello", 42), MyJob.new("world", 0))

# Encolando un array de trabajos
user_jobs = User.pluck(:id).map { |id| UserJob.new(user_id: id) }
ActiveJob.perform_all_later(user_jobs)

Al utilizar perform_all_later, puede optimizar su proceso de encolado de trabajos y aprovechar una mayor eficiencia, especialmente cuando trabaja con grandes conjuntos de trabajos. Vale la pena notar que para los adaptadores de colas que soportan el nuevo método enqueue_all, como el adaptador Sidekiq, el proceso de encolado se optimiza aún más usando push_bulk.

Tenga en cuenta que este nuevo método introduce un evento separado, enqueue_all.active_job, y no utiliza el evento enqueue.active_job existente. Esto asegura un seguimiento y reporte precisos del proceso de encolado en masa.

2.5 Claves primarias compuestas

Las claves primarias compuestas ahora son compatibles tanto a nivel de base de datos como de aplicación. Rails es capaz de derivar estas claves directamente del esquema. Esta característica es particularmente beneficiosa para relaciones de muchos a muchos y otros modelos de datos complejos donde una sola columna es insuficiente para identificar un registro de manera única.

El SQL generado por los métodos de consulta en Active Record (por ejemplo, #reload, #update, #delete) contendrá todas las partes de la clave primaria compuesta. Métodos como #first y #last usarán la clave primaria compuesta completa en las declaraciones ORDER BY.

La macro query_constraints se puede usar como una "clave primaria virtual" para lograr el mismo comportamiento sin modificar el esquema de la base de datos. Ejemplo:

class TravelRoute < ActiveRecord::Base
  query_constraints :origin, :destination
end

De manera similar, las asociaciones aceptan una opción query_constraints:. Esta opción sirve como una clave externa compuesta, configurando la lista de columnas utilizadas para acceder al registro asociado.

Ejemplo:

class TravelRouteReview < ActiveRecord::Base
  belongs_to :travel_route, query_constraints: [:travel_route_origin, :travel_route_destination]
end

2.6 Introducir adaptador para Trilogy

Se ha introducido un nuevo adaptador para facilitar la integración sin problemas de Trilogy, un cliente de base de datos compatible con MySQL, con aplicaciones Rails. Ahora, las aplicaciones Rails tienen la opción de incorporar la funcionalidad de Trilogy configurando su archivo config/database.yml. Por ejemplo:

development:
  adapter: trilogy
  database: blog_development
  pool: 5

Alternativamente, la integración se puede lograr usando la variable de entorno DATABASE_URL:

ENV['DATABASE_URL'] # => "trilogy://localhost/blog_development?pool=5"

2.7 Añadir ActiveSupport::MessagePack

ActiveSupport::MessagePack es un serializador que se integra con la gema msgpack. ActiveSupport::MessagePack puede serializar los tipos básicos de Ruby soportados por msgpack, así como varios tipos adicionales como Time, ActiveSupport::TimeWithZone, y ActiveSupport::HashWithIndifferentAccess. Comparado con JSON y Marshal, ActiveSupport::MessagePack puede reducir el tamaño de la carga útil y mejorar el rendimiento.

ActiveSupport::MessagePack se puede usar como un serializador de mensajes:

config.active_support.message_serializer = :message_pack

# O individualmente:
ActiveSupport::MessageEncryptor.new(secret, serializer: :message_pack)
ActiveSupport::MessageVerifier.new(secret, serializer: :message_pack)

Como el serializador de cookies:

config.action_dispatch.cookies_serializer = :message_pack

Y como un serializador de caché:

config.cache_store = :file_store, "tmp/cache", { serializer: :message_pack }

# O individualmente:
ActiveSupport::Cache.lookup_store(:file_store, "tmp/cache", serializer: :message_pack)

2.8 Introducción de config.autoload_lib y config.autoload_lib_once para Autocarga Mejorada

Se ha introducido un nuevo método de configuración, config.autoload_lib(ignore:), para mejorar las rutas de autocarga de las aplicaciones al incluir el directorio lib, que no está incluido por defecto. Además, config.autoload_lib(ignore: %w(assets tasks)) se genera para nuevas aplicaciones.

Cuando se invoca desde config/application.rb o config/environments/*.rb, este método agrega el directorio lib tanto a config.autoload_paths como a config.eager_load_paths. Es importante tener en cuenta que esta característica no está disponible para motores.

Para asegurar flexibilidad, el argumento de palabra clave ignore se puede usar para especificar subdirectorios dentro del directorio lib que no deben ser gestionados por los autocargadores. Por ejemplo, puede excluir directorios como assets, tasks, y generators pasándolos al argumento ignore:

config.autoload_lib(ignore: %w(assets tasks generators))

El método config.autoload_lib_once es similar a config.autoload_lib, excepto que agrega lib a config.autoload_once_paths.

Por favor, vea más detalles en la guía de autocarga

2.9 API de Active Record para consultas asincrónicas generales

Se ha introducido una mejora significativa en la API de Active Record, ampliando su soporte para consultas asincrónicas. Esta mejora aborda la necesidad de un manejo más eficiente de consultas no tan rápidas, enfocándose particularmente en agregados (como count, sum, etc.) y todos los métodos que devuelven un solo registro o cualquier cosa que no sea un Relation.

La nueva API incluye los siguientes métodos asincrónicos:

  • async_count
  • async_sum
  • async_minimum
  • async_maximum
  • async_average
  • async_pluck
  • async_pick
  • async_ids
  • async_find_by_sql
  • async_count_by_sql

Aquí hay un breve ejemplo de cómo usar uno de estos métodos, async_count, para contar el número de publicaciones publicadas de manera asincrónica:

# Conteo sincrónico
published_count = Post.where(published: true).count # => 10

# Conteo asincrónico
promise = Post.where(published: true).async_count # => #<ActiveRecord::Promise status=pending>
promise.value # => 10

Estos métodos permiten la ejecución de estas operaciones de manera asincrónica, lo que puede mejorar significativamente el rendimiento para ciertos tipos de consultas de base de datos.

2.10 Permitir que las plantillas establezcan locals estrictos

Introducir una nueva característica que permite que las plantillas establezcan locals explícitos. Esta mejora proporciona mayor control y claridad al pasar variables a sus plantillas.

Por defecto, las plantillas aceptarán cualquier locals como argumentos de palabra clave. Sin embargo, ahora puede definir qué locals debe aceptar una plantilla agregando un comentario mágico locals al principio de su archivo de plantilla.

Así es como funciona:

<%# locals: (message:) -%>
<%= message %>

También puede establecer valores predeterminados para estos locales:

<%# locals: (message: "Hello, world!") -%>
<%= message %>

Los argumentos de palabra clave opcionales se pueden expandir:

<%# locals: (message: "Hello, world!", **attributes) -%>
<%= tag.p(message, **attributes) %>

Si desea desactivar el uso de locales por completo, puede hacerlo así:

<%# locals: () %>

Action View procesará el comentario mágico locals: en cualquier motor de plantillas que soporte comentarios con prefijo #, y leerá el comentario mágico de cualquier línea en el parcial.

PRECAUCIÓN: Solo se admiten argumentos de palabra clave. Definir argumentos posicionales o de bloque generará un error de Action View en tiempo de renderizado.

2.11 Añadir Rails.application.deprecators

El nuevo método Rails.application.deprecators devuelve una colección de deprecadores gestionados dentro de su aplicación, y le permite agregar y recuperar deprecadores individuales con facilidad:

Rails.application.deprecators[:my_gem] = ActiveSupport::Deprecation.new("2.0", "MyGem")
Rails.application.deprecators[:other_gem] = ActiveSupport::Deprecation.new("3.0", "OtherGem")

Las configuraciones de la colección afectan a todos los deprecadores en la colección.

Rails.application.deprecators.debug = true

Rails.application.deprecators[:my_gem].debug
# => true

Rails.application.deprecators[:other_gem].debug
# => true

Hay escenarios donde podría querer silenciar todas las advertencias de deprecación para un bloque específico de código. Con la colección de deprecadores, puede silenciar fácilmente todas las advertencias de deprecación dentro de un bloque:

Rails.application.deprecators.silence do
  Rails.application.deprecators[:my_gem].warn    # Sin advertencia (silenciado)
  Rails.application.deprecators[:other_gem].warn # Sin advertencia (silenciado)
end

2.12 Soporte para coincidencia de patrones en response.parsed_body JSON

Cuando los bloques de prueba de ActionDispatch::IntegrationTest invocan response.parsed_body para respuestas JSON, sus cargas estarán disponibles con acceso indiferente. Esto permite la integración con Coincidencia de Patrones de Ruby, y soporte integrado de Minitest para coincidencia de patrones:

get "/posts.json"

response.content_type         # => "application/json; charset=utf-8"
response.parsed_body.class    # => Array
response.parsed_body          # => [{"id"=>42, "title"=>"Title"},...

assert_pattern { response.parsed_body => [{ id: 42 }] }

get "/posts/42.json"

response.content_type         # => "application/json; charset=utf-8"
response.parsed_body.class    # => ActiveSupport::HashWithIndifferentAccess
response.parsed_body          # => {"id"=>42, "title"=>"Title"}

assert_pattern { response.parsed_body => [{ title: /title/i }] }

2.13 Extender response.parsed_body para analizar HTML con Nokogiri

Extender el módulo ActionDispatch::Testing para soportar el análisis del valor de un response.body HTML en una instancia Nokogiri::HTML5::Document:

get "/posts"

response.content_type         # => "text/html; charset=utf-8"
response.parsed_body.class    # => Nokogiri::HTML5::Document
response.parsed_body.to_html  # => "<!DOCTYPE html>\n<html>\n..."

El soporte recientemente añadido de Nokogiri para coincidencia de patrones, junto con el soporte integrado de Minitest para coincidencia de patrones presenta oportunidades para hacer afirmaciones de prueba sobre la estructura y contenido de la respuesta HTML:

get "/posts"

html = response.parsed_body # => <html>
                            #      <head></head>
                            #        <body>
                            #          <main><h1>Some main content</h1></main>
                            #        </body>
                            #     </html>

assert_pattern { html.at("main") => { content: "Some main content" } }
assert_pattern { html.at("main") => { content: /content/ } }
assert_pattern { html.at("main") => { children: [{ name: "h1", content: /content/ }] } }

2.14 Introducir ActionView::TestCase.register_parser

Extender ActionView::TestCase para soportar el análisis del contenido renderizado por vistas parciales en estructuras conocidas. Por defecto, definir rendered_html para analizar HTML en un Nokogiri::XML::Node y rendered_json para analizar JSON en un ActiveSupport::HashWithIndifferentAccess:

test "renders HTML" do
  article = Article.create!(title: "Hello, world")

  render partial: "articles/article", locals: { article: article }

  assert_pattern { rendered_html.at("main h1") => { content: "Hello, world" } }
end

test "renders JSON" do
  article = Article.create!(title: "Hello, world")

  render formats: :json, partial: "articles/article", locals: { article: article }

  assert_pattern { rendered_json => { title: "Hello, world" } }
end

Para analizar el contenido renderizado en RSS, registre una llamada a RSS::Parser.parse:

register_parser :rss, -> rendered { RSS::Parser.parse(rendered) }

test "renders RSS" do
  article = Article.create!(title: "Hello, world")

  render formats: :rss, partial: article, locals: { article: article }

  assert_equal "Hello, world", rendered_rss.items.last.title
end

Para analizar el contenido renderizado en un Capybara::Simple::Node, vuelva a registrar un analizador :html con una llamada a Capybara.string:

register_parser :html, -> rendered { Capybara.string(rendered) }

test "renders HTML" do
  article = Article.create!(title: "Hello, world")

  render partial: article

  rendered_html.assert_css "main h1", text: "Hello, world"
end

3 Railties

Consulte el Changelog para cambios detallados.

3.1 Eliminaciones

  • Eliminar el comando bin/rails secrets:setup obsoleto.

  • Eliminar el encabezado predeterminado X-Download-Options ya que solo es utilizado por Internet Explorer.

3.2 Deprecaciones

  • Despreciar el uso de Rails.application.secrets.

  • Despreciar los comandos secrets:show y secrets:edit a favor de credentials.

  • Despreciar Rails::Generators::Testing::Behaviour a favor de Rails::Generators::Testing::Behavior.

3.3 Cambios notables

  • Añadir la opción sandbox_by_default para iniciar la consola de Rails en modo sandbox por defecto.

  • Añadir nueva sintaxis para soporte de filtrado de pruebas por rangos de líneas.

  • Añadir la opción DATABASE que permite la especificación de la base de datos objetivo al ejecutar el comando rails railties:install:migrations para copiar migraciones.

  • Añadir soporte para Bun en el generador rails new --javascript.

    $ rails new my_new_app --javascript=bun
    
  • Añadir capacidad para mostrar pruebas lentas al ejecutor de pruebas.

4 Action Cable

Consulte el Changelog para cambios detallados.

4.1 Eliminaciones

4.2 Deprecaciones

4.3 Cambios notables

  • Añadir el helper de prueba capture_broadcasts para capturar todos los mensajes transmitidos en un bloque.

  • Añadir la capacidad al adaptador de pub/sub de Redis para reconectarse automáticamente cuando se pierde la conexión con Redis.

  • Añadir callbacks de comando before_command, after_command, y around_command a ActionCable::Connection::Base.

5 Action Pack

Consulte el Changelog para cambios detallados.

5.1 Eliminaciones

  • Eliminar comportamiento obsoleto en Request#content_type

  • Eliminar la capacidad obsoleta de asignar un solo valor a config.action_dispatch.trusted_proxies.

  • Eliminar el registro de controladores poltergeist y webkit (capybara-webkit) obsoletos para pruebas de sistema.

5.2 Deprecaciones

  • Despreciar config.action_dispatch.return_only_request_media_type_on_content_type.

  • Despreciar AbstractController::Helpers::MissingHelperError.

  • Despreciar ActionDispatch::IllegalStateError.

  • Despreciar las directivas de política de permisos speaker, vibrate, y vr.

  • Despreciar los valores true y false para config.action_dispatch.show_exceptions a favor de :all, :rescuable, o :none.

5.3 Cambios notables

  • Añadir método exclude? a ActionController::Parameters. Es el inverso del método include?.

  • Añadir método ActionController::Parameters#extract_value para permitir extraer valores serializados de params.

  • Añadir la capacidad de usar lógica personalizada para almacenar y recuperar tokens CSRF.

  • Añadir argumentos html y screenshot para el helper de captura de pantalla de pruebas de sistema.

6 Action View

Consulte el Changelog para cambios detallados.

6.1 Eliminaciones

  • Eliminar constante ActionView::Path obsoleta.

  • Eliminar soporte obsoleto para pasar variables de instancia como locales a parciales.

6.2 Deprecaciones

6.3 Cambios notables

  • check_box_tag y radio_button_tag ahora aceptan checked como un argumento de palabra clave.

  • Añadir helper picture_tag para generar etiquetas HTML <picture>.

  • El helper simple_format ahora maneja una característica :sanitize_options, permitiendo la adición de opciones adicionales para el proceso de sanitización.

    simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>", {}, { sanitize_options: { attributes: %w[target href] } })
    # => "<p><a target=\"_blank\" href=\"http://example.com\">Continue</a></p>"
    

7 Action Mailer

Consulte el Changelog para cambios detallados.

7.1 Eliminaciones

7.2 Deprecaciones

  • Despreciar config.action_mailer.preview_path.

  • Despreciar pasar params a assert_enqueued_email_with a través del argumento :args. Ahora soporta un argumento :params, así que úselo para pasar params.

7.3 Cambios notables

  • Añadir config.action_mailer.preview_paths para soportar múltiples rutas de vista previa.

  • Añadir capture_emails en el helper de prueba para capturar todos los correos electrónicos enviados en un bloque.

  • Añadir deliver_enqueued_emails a ActionMailer::TestHelper para entregar todos los trabajos de correo electrónico encolados.

8 Active Record

Consulte el Changelog para cambios detallados.

8.1 Eliminaciones

  • Eliminar soporte para ActiveRecord.legacy_connection_handling.

  • Eliminar accesores de configuración obsoletos de ActiveRecord::Base.

  • Eliminar soporte para :include_replicas en configs_for. Use :include_hidden en su lugar.

  • Eliminar config.active_record.partial_writes obsoleto.

  • Eliminar Tasks::DatabaseTasks.schema_file_type obsoleto.

  • Eliminar la bandera --no-comments en volcado de estructuras para PostgreSQL.

8.2 Deprecaciones

  • Despreciar argumento name en #remove_connection.

  • Despreciar check_pending! a favor de check_all_pending!.

  • Despreciar la opción deferrable: true de add_foreign_key a favor de deferrable: :immediate.

  • Despreciar TestFixtures#fixture_path a favor de TestFixtures#fixture_paths.

  • Despreciar delegación de Base a connection_handler.

  • Despreciar config.active_record.suppress_multiple_database_warning.

  • Despreciar el uso de ActiveSupport::Duration como un parámetro de enlace interpolado en una plantilla de cadena SQL.

  • Despreciar all_connection_pools y hacer connection_pool_list más explícito.

  • Despreciar read_attribute(:id) devolviendo la clave primaria si la clave primaria no es :id.

  • Despreciar argumento rewhere en #merge.

  • Despreciar aliasing de no-atributos con alias_attribute.

8.3 Cambios notables

  • Añadir TestFixtures#fixture_paths para soportar múltiples rutas de fixtures.

  • Añadir authenticate_by cuando se usa has_secure_password.

  • Añadir update_attribute! a ActiveRecord::Persistence, que es similar a update_attribute pero lanza ActiveRecord::RecordNotSaved cuando un callback before_* lanza :abort.

  • Permitir el uso de atributos alias con insert_all/upsert_all.

  • Añadir opción :include a add_index.

  • Añadir método de consulta #regroup como un atajo para .unscope(:group).group(fields).

  • Añadir soporte para columnas auto-pobladas y claves primarias personalizadas al adaptador SQLite3.

  • Añadir valores predeterminados modernos y de alto rendimiento para conexiones de base de datos SQLite3.

  • Permitir especificar cláusulas where con sintaxis de tupla de columna.

    Topic.where([:title, :author_name] => [["The Alchemist", "Paulo Coelho"], ["Harry Potter", "J.K Rowling"]])
    
  • Los nombres de índices generados automáticamente ahora están limitados a 62 bytes, lo que se ajusta dentro de los límites de longitud de nombre de índice predeterminados para MySQL, PostgreSQL y SQLite.

  • Introducir adaptador para el cliente de base de datos Trilogy.

  • Añadir método ActiveRecord.disconnect_all! para cerrar inmediatamente todas las conexiones de todos los pools.

  • Añadir comandos de migración de PostgreSQL para renombrar enum, añadir valor, y renombrar valor.

  • Añadir alias ActiveRecord::Base#id_value para acceder al valor bruto de la columna id de un registro.

  • Añadir opción de validación para enum.

9 Active Storage

Consulte el Changelog para cambios detallados.

9.1 Eliminaciones

  • Eliminar tipos de contenido predeterminados inválidos obsoletos en configuraciones de Active Storage.

  • Eliminar métodos ActiveStorage::Current#host y ActiveStorage::Current#host= obsoletos.

  • Eliminar comportamiento obsoleto al asignar a una colección de archivos adjuntos. En lugar de agregar a la colección, la colección ahora se reemplaza.

  • Eliminar métodos purge y purge_later obsoletos de la asociación de archivos adjuntos.

9.2 Deprecaciones

9.3 Cambios notables

  • ActiveStorage::Analyzer::AudioAnalyzer ahora produce sample_rate y tags en el hash de salida metadata.

  • Añadir la opción de utilizar variantes predefinidas al invocar los métodos preview o representation en un archivo adjunto.

  • Se añadió la opción preprocessed al declarar variantes para preprocesar variantes.

  • Añadir la capacidad de destruir variantes de Active Storage.

    User.first.avatar.variant(resize_to_limit: [100, 100]).destroy
    

10 Active Model

Consulte el Changelog para cambios detallados.

10.1 Eliminaciones

10.2 Deprecaciones

10.3 Cambios notables

  • Añadir soporte para rangos infinitos a las opciones :in/:within de LengthValidator.

    validates_length_of :first_name, in: ..30
    
  • Añadir soporte para rangos sin inicio a los validadores de inclusión/exclusión.

    validates_inclusion_of :birth_date, in: -> { (..Date.today) }
    
    validates_exclusion_of :birth_date, in: -> { (..Date.today) }
    
  • Añadir soporte para desafíos de contraseña a has_secure_password. Cuando se establece, validar que el desafío de contraseña coincida con el password_digest persistido.

  • Permitir que los validadores acepten lambdas sin argumento de registro.

    # Antes
    validates_comparison_of :birth_date, less_than_or_equal_to: ->(_record) { Date.today }
    
    # Después
    validates_comparison_of :birth_date, less_than_or_equal_to: -> { Date.today }
    

11 Active Support

Consulte el Changelog para cambios detallados.

11.1 Eliminaciones

  • Eliminar la sobreescritura de Enumerable#sum obsoleta.

  • Eliminar ActiveSupport::PerThreadRegistry obsoleto.

  • Eliminar la opción obsoleta para pasar un formato a #to_s en Array, Range, Date, DateTime, Time, BigDecimal, Float y Integer.

  • Eliminar la sobreescritura de ActiveSupport::TimeWithZone.name obsoleta.

  • Eliminar archivo active_support/core_ext/uri obsoleto.

  • Eliminar archivo active_support/core_ext/range/include_time_with_zone obsoleto.

  • Eliminar la conversión implícita de objetos en String por ActiveSupport::SafeBuffer.

  • Eliminar soporte obsoleto para generar UUIDs incorrectos RFC 4122 al proporcionar un ID de espacio de nombres que no es uno de los constantes definidas en Digest::UUID.

11.2 Deprecaciones

  • Despreciar config.active_support.disable_to_s_conversion.

  • Despreciar config.active_support.remove_deprecated_time_with_zone_name.

  • Despreciar config.active_support.use_rfc4122_namespaced_uuids.

  • Despreciar SafeBuffer#clone_empty.

  • Despreciar el uso del singleton ActiveSupport::Deprecation.

  • Despreciar la inicialización de un ActiveSupport::Cache::MemCacheStore con una instancia de Dalli::Client.

  • Despreciar los métodos #children y #parent_of? de Notification::Event.

11.3 Cambios notables

12 Active Job

Consulte el Changelog para cambios detallados.

12.1 Eliminaciones

  • Eliminar QueAdapter.

12.2 Deprecaciones

12.3 Cambios notables

  • Añadir perform_all_later para encolar múltiples trabajos a la vez.

  • Añadir opción --parent al generador de trabajos para especificar la clase padre del trabajo.

  • Añadir método after_discard a ActiveJob::Base para ejecutar un callback cuando un trabajo está a punto de ser descartado.

  • Añadir soporte para registrar los llamadores de encolado de trabajos en segundo plano.

13 Action Text

Consulte el Changelog para cambios detallados.

13.1 Eliminaciones

13.2 Deprecaciones

13.3 Cambios notables

14 Action Mailbox

Consulte el Changelog para cambios detallados.

14.1 Eliminaciones

14.2 Deprecaciones

14.3 Cambios notables

  • Añadir direcciones X-Forwarded-To a los destinatarios.

  • Añadir método bounce_now_with a ActionMailbox::Base para enviar el correo de rebote sin pasar por una cola de correo.

15 Guías de Ruby on Rails

Consulte el Changelog para cambios detallados.

15.1 Cambios notables

16 Créditos

Vea la lista completa de colaboradores de Rails por las muchas personas que dedicaron muchas horas a hacer de Rails, el marco estable y robusto que es. Felicitaciones 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.