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
ysecrets:edit
a favor decredentials
.Despreciar
Rails::Generators::Testing::Behaviour
a favor deRails::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 comandorails 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
, yaround_command
aActionCable::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
ywebkit
(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
true
yfalse
paraconfig.action_dispatch.show_exceptions
a 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_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
yscreenshot
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
yradio_button_tag
ahora aceptanchecked
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
aActionMailer::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
enconfigs_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 decheck_all_pending!
.Despreciar la opción
deferrable: true
deadd_foreign_key
a favor dedeferrable: :immediate
.Despreciar
TestFixtures#fixture_path
a favor deTestFixtures#fixture_paths
.Despreciar delegación de
Base
aconnection_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 hacerconnection_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 usahas_secure_password
.Añadir
update_attribute!
aActiveRecord::Persistence
, que es similar aupdate_attribute
pero lanzaActiveRecord::RecordNotSaved
cuando un callbackbefore_*
lanza:abort
.Permitir el uso de atributos alias con
insert_all
/upsert_all
.Añadir opción
:include
aadd_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
yActiveStorage::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
ypurge_later
obsoletos de la asociación de archivos adjuntos.
9.2 Deprecaciones
9.3 Cambios notables
ActiveStorage::Analyzer::AudioAnalyzer
ahora producesample_rate
ytags
en el hash de salidametadata
.Añadir la opción de utilizar variantes predefinidas al invocar los métodos
preview
orepresentation
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
deLengthValidator
.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 elpassword_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
enArray
,Range
,Date
,DateTime
,Time
,BigDecimal
,Float
yInteger
.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
porActiveSupport::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 deDalli::Client
.Despreciar los métodos
#children
y#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_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
aActiveJob::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
aActionMailbox::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.