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_countasync_sumasync_minimumasync_maximumasync_averageasync_pluckasync_pickasync_idsasync_find_by_sqlasync_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:setupobsoleto.Eliminar el encabezado predeterminado
X-Download-Optionsya que solo es utilizado por Internet Explorer.
3.2 Deprecaciones
Despreciar el uso de
Rails.application.secrets.Despreciar los comandos
secrets:showysecrets:edita favor decredentials.Despreciar
Rails::Generators::Testing::Behavioura favor deRails::Generators::Testing::Behavior.
3.3 Cambios notables
Añadir la opción
sandbox_by_defaultpara 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
DATABASEque permite la especificación de la base de datos objetivo al ejecutar el comandorails railties:install:migrationspara copiar migraciones.Añadir soporte para Bun en el generador
rails new --javascript.$ rails new my_new_app --javascript=bunAñ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_broadcastspara 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, yaround_commandaActionCable::Connection::Base.
5 Action Pack
Consulte el Changelog para cambios detallados.
5.1 Eliminaciones
Eliminar comportamiento obsoleto en
Request#content_typeEliminar la capacidad obsoleta de asignar un solo valor a
config.action_dispatch.trusted_proxies.Eliminar el registro de controladores
poltergeistywebkit(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, yvr.Despreciar los valores
trueyfalseparaconfig.action_dispatch.show_exceptionsa favor de:all,:rescuable, o:none.
5.3 Cambios notables
Añadir método
exclude?aActionController::Parameters. Es el inverso del métodoinclude?.Añadir método
ActionController::Parameters#extract_valuepara permitir extraer valores serializados de params.Añadir la capacidad de usar lógica personalizada para almacenar y recuperar tokens CSRF.
Añadir argumentos
htmlyscreenshotpara 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::Pathobsoleta.Eliminar soporte obsoleto para pasar variables de instancia como locales a parciales.
6.2 Deprecaciones
6.3 Cambios notables
check_box_tagyradio_button_tagahora aceptancheckedcomo un argumento de palabra clave.Añadir helper
picture_tagpara generar etiquetas HTML<picture>.El helper
simple_formatahora 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_witha 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_pathspara soportar múltiples rutas de vista previa.Añadir
capture_emailsen el helper de prueba para capturar todos los correos electrónicos enviados en un bloque.Añadir
deliver_enqueued_emailsaActionMailer::TestHelperpara 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_replicasenconfigs_for. Use:include_hiddenen su lugar.Eliminar
config.active_record.partial_writesobsoleto.Eliminar
Tasks::DatabaseTasks.schema_file_typeobsoleto.Eliminar la bandera
--no-commentsen volcado de estructuras para PostgreSQL.
8.2 Deprecaciones
Despreciar argumento
nameen#remove_connection.Despreciar
check_pending!a favor decheck_all_pending!.Despreciar la opción
deferrable: truedeadd_foreign_keya favor dedeferrable: :immediate.Despreciar
TestFixtures#fixture_patha favor deTestFixtures#fixture_paths.Despreciar delegación de
Baseaconnection_handler.Despreciar
config.active_record.suppress_multiple_database_warning.Despreciar el uso de
ActiveSupport::Durationcomo un parámetro de enlace interpolado en una plantilla de cadena SQL.Despreciar
all_connection_poolsy hacerconnection_pool_listmás explícito.Despreciar
read_attribute(:id)devolviendo la clave primaria si la clave primaria no es:id.Despreciar argumento
rewhereen#merge.Despreciar aliasing de no-atributos con
alias_attribute.
8.3 Cambios notables
Añadir
TestFixtures#fixture_pathspara soportar múltiples rutas de fixtures.Añadir
authenticate_bycuando se usahas_secure_password.Añadir
update_attribute!aActiveRecord::Persistence, que es similar aupdate_attributepero lanzaActiveRecord::RecordNotSavedcuando un callbackbefore_*lanza:abort.Permitir el uso de atributos alias con
insert_all/upsert_all.Añadir opción
:includeaadd_index.Añadir método de consulta
#regroupcomo 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_valuepara 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#hostyActiveStorage::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
purgeypurge_laterobsoletos de la asociación de archivos adjuntos.
9.2 Deprecaciones
9.3 Cambios notables
ActiveStorage::Analyzer::AudioAnalyzerahora producesample_rateytagsen el hash de salidametadata.Añadir la opción de utilizar variantes predefinidas al invocar los métodos
previeworepresentationen un archivo adjunto.Se añadió la opción
preprocessedal 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/:withindeLengthValidator.validates_length_of :first_name, in: ..30Añ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 elpassword_digestpersistido.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#sumobsoleta.Eliminar
ActiveSupport::PerThreadRegistryobsoleto.Eliminar la opción obsoleta para pasar un formato a
#to_senArray,Range,Date,DateTime,Time,BigDecimal,FloatyInteger.Eliminar la sobreescritura de
ActiveSupport::TimeWithZone.nameobsoleta.Eliminar archivo
active_support/core_ext/uriobsoleto.Eliminar archivo
active_support/core_ext/range/include_time_with_zoneobsoleto.Eliminar la conversión implícita de objetos en
StringporActiveSupport::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::MemCacheStorecon una instancia deDalli::Client.Despreciar los métodos
#childreny#parent_of?deNotification::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_laterpara encolar múltiples trabajos a la vez.Añadir opción
--parental generador de trabajos para especificar la clase padre del trabajo.Añadir método
after_discardaActiveJob::Basepara 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-Toa los destinatarios.Añadir método
bounce_now_withaActionMailbox::Basepara 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.