1 Actualización a Rails 5.2
Si está actualizando una aplicación existente, es una buena idea tener una buena cobertura de pruebas antes de comenzar. También debe actualizar primero a Rails 5.1 en caso de que no lo haya hecho y asegurarse de que su aplicación siga funcionando como se espera antes de intentar una actualización a Rails 5.2. Una lista de cosas a tener en cuenta al actualizar está disponible en la guía Actualización de Ruby on Rails.
2 Funciones principales
2.1 Active Storage
Active Storage facilita la carga de archivos a un servicio de almacenamiento en la nube como Amazon S3, Google Cloud Storage o Microsoft Azure Storage y la adjunta a objetos Active Record. Viene con un servicio basado en disco local para desarrollo y pruebas, y admite la duplicación de archivos en servicios subordinados para copias de seguridad y migraciones. Puede obtener más información sobre Active Storage en la guía Descripción general de Active Storage.
2.2 Redis Cache Store
Rails 5.2 incluye una tienda de caché Redis incorporada. Puede obtener más información al respecto en la guía Caché con Rails: una descripción general.
2.3 HTTP/2 Early Hints
Rails 5.2 admite HTTP/2 Early Hints. Para iniciar el servidor con Early Hints habilitado, pase --early-hints
a bin/rails server
.
2.4 Credentials
Se agregó el archivo config/credentials.yml.enc
para almacenar secretos de la aplicación de producción. Permite guardar cualquier credencial de autenticación para servicios de terceros directamente en el repositorio cifrado con una clave en el archivo config/master.key
o la variable de entorno RAILS_MASTER_KEY
. Esto eventualmente reemplazará a Rails.application.secrets
y los secretos cifrados introducidos en Rails 5.1. Además, Rails 5.2 abre la API subyacente de Credentials, por lo que puede manejar fácilmente otras configuraciones, claves y archivos cifrados. Puede obtener más información al respecto en la guía Seguridad de las aplicaciones Rails.
2.5 Content Security Policy
Rails 5.2 incluye un nuevo DSL que le permite configurar una Content Security Policy para su aplicación. Puede configurar una política predeterminada global y luego anularla en función de cada recurso e incluso usar lambdas para inyectar valores por solicitud en el encabezado, como subdominios de cuenta en una aplicación multiinquilino. Puede obtener más información al respecto en la guía Seguridad de las aplicaciones Rails.
3 Railties
Consulte el registro de cambios para obtener información detallada sobre los cambios.
3.1 Obsolescencias
Obsoleta el método
capify!
en generadores y plantillas. (Pull Request)Se ha obsoleto pasar el nombre del entorno como un argumento regular a los comandos
rails dbconsole
yrails console
. En su lugar, se debe utilizar la opción-e
. (Commit)Obsoleta la utilización de una subclase de
Rails::Application
para iniciar el servidor de Rails. (Pull Request)Obsoleta la devolución de llamada
after_bundle
en las plantillas de los complementos de Rails. (Pull Request)
3.2 Cambios destacados
Se agregó una sección compartida a
config/database.yml
que se cargará para todos los entornos. (Pull Request)Agregar
railtie.rb
al generador de complementos. (Pull Request)Limpiar los archivos de captura de pantalla en la tarea
tmp:clear
. (Pull Request)Omitir los componentes no utilizados al ejecutar
bin/rails app:update
. Si la generación inicial de la aplicación omitió Action Cable, Active Record, etc., la tarea de actualización también respeta esas omisiones. (Pull Request)Permitir pasar un nombre de conexión personalizado al comando
rails dbconsole
cuando se utiliza una configuración de base de datos de 3 niveles. Ejemplo:bin/rails dbconsole -c replica
. (Commit)Expandir correctamente los atajos para el nombre del entorno al ejecutar los comandos
console
ydbconsole
. (Commit)Agregar
bootsnap
alGemfile
predeterminado. (Pull Request)Admitir
-
como una forma independiente de plataforma para ejecutar un script desde stdin conrails runner
. (Pull Request)Agregar la versión
ruby x.x.x
alGemfile
y crear el archivo raíz.ruby-version
que contiene la versión actual de Ruby cuando se crean nuevas aplicaciones de Rails. (Pull Request)Agregar la opción
--skip-action-cable
al generador de complementos. (Pull Request)Agregar
git_source
alGemfile
para el generador de complementos. (Pull Request)Omitir los componentes no utilizados al ejecutar
bin/rails
en un complemento de Rails. (Commit)Optimizar la sangría de las acciones del generador. (Pull Request)
Optimizar la sangría de las rutas. (Pull Request)
Agregar la opción
--skip-yarn
al generador de complementos. (Pull Request)Admitir múltiples argumentos de versiones para el método
gem
de los generadores. (Pull Request)Derivar
secret_key_base
del nombre de la aplicación en los entornos de desarrollo y prueba. (Pull Request)Agregar
mini_magick
alGemfile
predeterminado como comentario. (Pull Request)rails new
yrails plugin new
obtienenActive Storage
de forma predeterminada. Agregar la capacidad de omitirActive Storage
con--skip-active-storage
y hacerlo automáticamente cuando se utiliza--skip-active-record
. (Pull Request)
4 Action Cable
Consulte el registro de cambios para obtener información detallada sobre los cambios.
4.1 Eliminaciones
- Se eliminó el adaptador de Redis basado en eventos obsoleto. (Commit)
4.2 Cambios destacados
Agregar soporte para las opciones
host
,port
,db
ypassword
en cable.yml (Pull Request)Hash los identificadores de transmisión largos al utilizar el adaptador de PostgreSQL. (Pull Request)
5 Action Pack
Consulte el registro de cambios para obtener información detallada sobre los cambios.
5.1 Eliminaciones
- Eliminar
ActionController::ParamsParser::ParseError
obsoleto. (Commit)
5.2 Obsolescencias
- Obsoleto
#success?
,#missing?
y#error?
alias deActionDispatch::TestResponse
. (Pull Request)
5.3 Cambios destacados
Agregar soporte para claves de caché reciclables con caché de fragmentos. (Pull Request)
Cambiar el formato de la clave de caché para fragmentos para facilitar la depuración de claves. (Pull Request)
Cookies y sesiones cifradas AEAD con GCM. (Pull Request)
Proteger contra falsificaciones de forma predeterminada. (Pull Request)
Aplicar el vencimiento de las cookies firmadas/cifradas en el servidor. (Pull Request)
La opción
:expires
de las cookies admite el objetoActiveSupport::Duration
. (Pull Request)Usar la configuración del servidor registrado
:puma
de Capybara. (Pull Request)Simplificar el middleware de cookies con soporte de rotación de claves. (Pull Request)
Agregar capacidad para habilitar Early Hints para HTTP/2. (Pull Request)
Agregar soporte de Chrome sin cabeza a las pruebas del sistema. (Pull Request)
Agregar opción
:allow_other_host
al métodoredirect_back
. (Pull Request)Hacer que
assert_recognizes
recorra los motores montados. (Pull Request)Agregar DSL para configurar la cabecera Content-Security-Policy. (Pull Request, Commit, Commit)
Registrar los tipos MIME de audio/video/fuente más populares admitidos por los navegadores modernos. (Pull Request)
Cambiar la salida de captura de pantalla de las pruebas del sistema de
inline
asimple
de forma predeterminada. (Commit)Agregar soporte de Firefox sin cabeza a las pruebas del sistema. (Pull Request)
Agregar
X-Download-Options
yX-Permitted-Cross-Domain-Policies
seguros a los encabezados predeterminados. (Commit)Cambiar las pruebas del sistema para establecer Puma como servidor predeterminado solo cuando el usuario no haya especificado manualmente otro servidor. (Pull Request)
Agregar encabezado
Referrer-Policy
a los encabezados predeterminados. (Commit)Coincidir con el comportamiento de
Hash#each
enActionController::Parameters#each
. (Pull Request)Agregar soporte para generación automática de nonce para Rails UJS. (Commit)
Actualizar el valor predeterminado de HSTS max-age a 31536000 segundos (1 año) para cumplir con el requisito mínimo de max-age para https://hstspreload.org/. (Commit)
Agregar método de alias
to_hash
ato_h
paracookies
. Agregar método de aliasto_h
ato_hash
parasession
. (Commit)
6 Action View
Consulte el registro de cambios para obtener cambios detallados.
6.1 Eliminaciones
- Eliminar el controlador ERB obsoleto de Erubis. (Commit)
6.2 Obsolescencias
- Obsoleto el ayudante
image_alt
que solía agregar texto alternativo predeterminado a las imágenes generadas porimage_tag
. (Pull Request)
6.3 Cambios destacados
Agregar tipo
:json
aauto_discovery_link_tag
para admitir JSON Feeds. (Pull Request)Agregar opción
srcset
al ayudanteimage_tag
. (Pull Request)Solucionar problemas con
field_error_proc
que envuelveoptgroup
y opción de división selectoption
. (Pull Request)Cambiar
form_with
para generar ids de forma predeterminada. (Commit)Agregar ayudante
preload_link_tag
. (Pull Request)Permitir el uso de objetos llamables como métodos de grupo para selects agrupados. (Pull Request)
Action Mailer
Consulte el registro de cambios para obtener cambios detallados.
6.4 Cambios destacados
Permitir que las clases de Action Mailer configuren su trabajo de entrega. (Solicitud de extracción)
Agregar el ayudante de prueba
assert_enqueued_email_with
. (Solicitud de extracción)
7 Active Record
Consulte el registro de cambios para obtener cambios detallados.
7.1 Eliminaciones
Eliminar
#migration_keys
obsoleto. (Solicitud de extracción)Eliminar el soporte obsoleto para
quoted_id
al convertir el tipo de un objeto Active Record. (Commit)Eliminar el argumento obsoleto
default
deindex_name_exists?
. (Commit)Eliminar el soporte obsoleto para pasar una clase a
:class_name
en las asociaciones. (Commit)Eliminar los métodos obsoletos
initialize_schema_migrations_table
yinitialize_internal_metadata_table
. (Commit)Eliminar el método obsoleto
supports_migrations?
. (Commit)Eliminar el método obsoleto
supports_primary_key?
. (Commit)Eliminar el método obsoleto
ActiveRecord::Migrator.schema_migrations_table_name
. (Commit)Eliminar el argumento obsoleto
name
de#indexes
. (Commit)Eliminar los argumentos obsoletos de
#verify!
. (Commit)Eliminar la configuración obsoleta
.error_on_ignored_order_or_limit
. (Commit)Eliminar el método obsoleto
#scope_chain
. (Commit)Eliminar el método obsoleto
#sanitize_conditions
. (Commit)
7.2 Obsolescencias
Obsoleto
supports_statement_cache?
. (Solicitud de extracción)Obsoleto pasar argumentos y bloque al mismo tiempo a
count
ysum
enActiveRecord::Calculations
. (Solicitud de extracción)Obsoleto delegar a
arel
enRelation
. (Solicitud de extracción)Obsoleto el método
set_state
enTransactionState
. (Commit)Obsoleto
expand_hash_conditions_for_aggregates
sin reemplazo. (Commit)
7.3 Cambios destacados
Al llamar al método de acceso dinámico a los fixtures sin argumentos, ahora devuelve todos los fixtures de este tipo. Anteriormente, este método siempre devolvía una matriz vacía. (Solicitud de extracción)
Corregir inconsistencia con los atributos cambiados al anular el lector de atributos de Active Record. (Solicitud de extracción)
Soporte para índices descendentes en MySQL. (Solicitud de extracción)
Corregir la primera migración de
bin/rails db:forward
. (Commit)Generar un error
UnknownMigrationVersionError
en el movimiento de migraciones cuando la migración actual no existe. (Commit)Respetar
SchemaDumper.ignore_tables
en las tareas de rake para la estructura de las bases de datos. (Solicitud de extracción)Agregar
ActiveRecord::Base#cache_version
para admitir claves de caché reciclables a través de las nuevas entradas versionadas enActiveSupport::Cache
. Esto también significa queActiveRecord::Base#cache_key
ahora devolverá una clave estable que ya no incluye una marca de tiempo. (Solicitud de extracción)Evitar la creación de un parámetro de enlace si el valor convertido es nulo. (Solicitud de extracción)
Usar INSERT masivo para insertar fixtures para obtener un mejor rendimiento. (Solicitud de extracción)
La fusión de dos relaciones que representan joins anidados ya no transforma los joins de la relación fusionada en LEFT OUTER JOIN. (Solicitud de extracción)
Corregir las transacciones para aplicar el estado a las transacciones secundarias. Anteriormente, si tenía una transacción anidada y la transacción externa se revertía, el registro de la transacción interna aún se marcaría como persistente. Se corrigió aplicando el estado de la transacción principal a la transacción secundaria cuando la transacción principal se revierte. Esto marcará correctamente los registros de la transacción interna como no persistentes. (Commit)
Corregir la carga ansiosa/precarga de asociaciones con alcance que incluye joins. (Pull Request)
Evitar que los errores generados por los suscriptores de notificaciones
sql.active_record
se conviertan en excepcionesActiveRecord::StatementInvalid
. (Pull Request)Omitir el almacenamiento en caché de consultas al trabajar con lotes de registros (
find_each
,find_in_batches
,in_batches
). (Commit)Cambiar la serialización booleana de sqlite3 para usar 1 y 0. SQLite reconoce nativamente 1 y 0 como verdadero y falso, pero no reconoce nativamente 't' y 'f' como se serializaba anteriormente. (Pull Request)
Los valores construidos utilizando asignación de múltiples parámetros ahora utilizarán el valor de poscasteo para su representación en campos de formulario de un solo campo. (Commit)
ApplicationRecord
ya no se genera al generar modelos. Si necesitas generarlo, puedes crearlo conrails g application_record
. (Pull Request)Relation#or
ahora acepta dos relaciones que tienen valores diferentes parareferences
solamente, ya quereferences
puede ser llamado implícitamente porwhere
. (Commit)Al utilizar
Relation#or
, extraer las condiciones comunes y colocarlas antes de la condición OR. (Pull Request)Agregar el método auxiliar de fixture
binary
. (Pull Request)Adivinar automáticamente las asociaciones inversas para STI. (Pull Request)
Agregar la nueva clase de error
LockWaitTimeout
que se generará cuando se exceda el tiempo de espera de bloqueo. (Pull Request)Actualizar los nombres de carga útil para la instrumentación
sql.active_record
para que sean más descriptivos. (Pull Request)Utilizar el algoritmo dado al eliminar un índice de la base de datos. (Pull Request)
Pasar un
Set
aRelation#where
ahora se comporta de la misma manera que pasar un array. (Commit)PostgreSQL
tsrange
ahora conserva la precisión de subsegundos. (Pull Request)Generar una excepción al llamar a
lock!
en un registro modificado. (Commit)Corregido un error donde los órdenes de columna para un índice no se escribían en
db/schema.rb
al utilizar el adaptador SQLite. (Pull Request)Corregir
bin/rails db:migrate
conVERSION
especificado.bin/rails db:migrate
conVERSION
vacío se comporta como sinVERSION
. Verificar el formato deVERSION
: Permitir un número de versión de migración o el nombre de un archivo de migración. Generar un error si el formato deVERSION
es inválido. Generar un error si la migración objetivo no existe. (Pull Request)Agregar la nueva clase de error
StatementTimeout
que se generará cuando se exceda el tiempo de espera de la declaración. (Pull Request)update_all
ahora pasará sus valores aType#cast
antes de pasarlos aType#serialize
. Esto significa queupdate_all(foo: 'true')
persistirá correctamente un booleano. (Commit)Requerir que los fragmentos de SQL sin procesar se marquen explícitamente cuando se usan en métodos de consulta de relaciones. (Commit, Commit)
Agregar
#up_only
a las migraciones de la base de datos para el código que solo es relevante al migrar hacia arriba, por ejemplo, poblar una nueva columna. (Pull Request)Agregar nueva clase de error
QueryCanceled
que se lanzará cuando se cancele una declaración debido a una solicitud del usuario. (Pull Request)No permitir definir ámbitos que entren en conflicto con los métodos de instancia en
Relation
. (Pull Request)Agregar soporte para clases de operadores de PostgreSQL a
add_index
. (Pull Request)Registrar los llamadores de las consultas de la base de datos. (Pull Request, Pull Request, Pull Request)
Anular los métodos de atributo en los descendientes al restablecer la información de columna. (Pull Request)
Usar subconsulta para
delete_all
conlimit
ooffset
. (Commit)Corregir inconsistencia con
first(n)
cuando se usa conlimit()
. El buscadorfirst(n)
ahora respeta ellimit()
, haciéndolo consistente conrelation.to_a.first(n)
, y también con el comportamiento delast(n)
. (Pull Request)Corregir asociaciones anidadas
has_many :through
en instancias de padres no persistidos. (Commit)Tomar en cuenta las condiciones de asociación al eliminar registros a través de ellos. (Commit)
No permitir la mutación de objetos destruidos después de llamar a
save
osave!
. (Commit)Corregir problema de fusión de relaciones con
left_outer_joins
. (Pull Request)Soporte para tablas externas de PostgreSQL. (Pull Request)
Limpiar el estado de transacción cuando se duplica un objeto Active Record. (Pull Request)
Corregir problema de expansión no realizada al pasar un objeto Array como argumento al método where utilizando una columna
composed_of
. (Pull Request)Hacer que
reflection.klass
lance una excepción sipolymorphic?
no se usa correctamente. (Commit)Corregir
#columns_for_distinct
de MySQL y PostgreSQL para queActiveRecord::FinderMethods#limited_ids_for
use los valores de clave primaria correctos incluso si las columnasORDER BY
incluyen la clave primaria de otra tabla. (Commit)Corregir problema de
dependent: :destroy
en la relación has_one/belongs_to donde la clase padre se eliminaba cuando el hijo no lo estaba. (Commit)Las conexiones inactivas de la base de datos (anteriormente solo las conexiones huérfanas) ahora se eliminan periódicamente por el recolector de conexiones del grupo de conexiones. (Commit)
8 Active Model
Consulte el registro de cambios para obtener cambios detallados.
8.1 Cambios destacados
Corregir los métodos
#keys
,#values
enActiveModel::Errors
. Cambiar#keys
para que solo devuelva las claves que no tienen mensajes vacíos. Cambiar#values
para que solo devuelva los valores no vacíos. (Pull Request)Agregar el método
#merge!
paraActiveModel::Errors
. (Pull Request)Permitir pasar un Proc o un símbolo a las opciones del validador de longitud. (Pull Request)
Ejecutar la validación de
ConfirmationValidator
cuando el valor de_confirmation
esfalse
. (Pull Request)Los modelos que utilizan la API de atributos con un valor predeterminado de tipo proc ahora se pueden serializar. (Commit)
No perder todas las múltiples
:includes
con opciones en la serialización. (Commit)
9 Active Support
Consulte el registro de cambios para obtener cambios detallados.
9.1 Eliminaciones
Eliminar el filtro de cadena
:if
y:unless
deprecado para los callbacks. (Commit)Eliminar la opción
halt_callback_chains_on_return_false
deprecada. (Commit)Deprecaciones
Deprecar el método
Module#reachable?
. (Pull Request)Deprecar
secrets.secret_token
. (Commit)
9.2 Cambios destacados
Agregar
fetch_values
paraHashWithIndifferentAccess
. (Pull Request)Agregar soporte para
:offset
enTime#change
. (Commit)Agregar soporte para
:offset
y:zone
enActiveSupport::TimeWithZone#change
. (Commit)Pasar el nombre de la gema y el horizonte de depreciación a las notificaciones de depreciación. (Pull Request)
Agregar soporte para entradas de caché versionadas. Esto permite que las tiendas de caché reciclen claves de caché, lo que ahorra mucho almacenamiento en casos con cambios frecuentes. Funciona junto con la separación de
#cache_key
y#cache_version
en Active Record y su uso en el almacenamiento en caché de fragmentos de Action Pack. (Pull Request)Agregar
ActiveSupport::CurrentAttributes
para proporcionar un singleton de atributos aislados en el hilo. El caso de uso principal es mantener todos los atributos por solicitud fácilmente disponibles para todo el sistema. (Pull Request)#singularize
y#pluralize
ahora respetan los incontables para el idioma especificado. (Commit)Agregar opción predeterminada a
class_attribute
. (Pull Request)Agregar
Date#prev_occurring
yDate#next_occurring
para devolver el día de la semana siguiente/anterior especificado. (Pull Request)Agregar opción predeterminada a los accesores de atributos de módulo y clase. (Pull Request)
Caché:
write_multi
. (Pull Request)Establecer por defecto
ActiveSupport::MessageEncryptor
para usar cifrado AES 256 GCM. (Pull Request)Agregar ayudante
freeze_time
que congela el tiempo enTime.now
en las pruebas. (Pull Request)Hacer que el orden de
Hash#reverse_merge!
sea consistente conHashWithIndifferentAccess
. (Pull Request)Agregar soporte para propósito y expiración a
ActiveSupport::MessageVerifier
yActiveSupport::MessageEncryptor
. (Pull Request)Actualizar
String#camelize
para proporcionar retroalimentación cuando se pasa una opción incorrecta. (Pull Request)Module#delegate_missing_to
ahora genera unDelegationError
si el objetivo es nulo, similar aModule#delegate
. (Pull Request)Agregar
ActiveSupport::EncryptedFile
yActiveSupport::EncryptedConfiguration
. (Pull Request)Agregar
config/credentials.yml.enc
para almacenar secretos de la aplicación de producción. (Pull Request)Agregar soporte de rotación de claves a
MessageEncryptor
yMessageVerifier
. (Pull Request)Devolver una instancia de
HashWithIndifferentAccess
desdeHashWithIndifferentAccess#transform_keys
. (Pull Request)Hash#slice
ahora utiliza la definición incorporada de Ruby 2.5+ si está definida. (Commit)IO#to_json
ahora devuelve la representaciónto_s
, en lugar de intentar convertir a un array. Esto soluciona un error dondeIO#to_json
generaba unIOError
al llamarlo en un objeto no legible. (Pull Request)Agregar la misma firma de método para
Time#prev_day
yTime#next_day
de acuerdo conDate#prev_day
,Date#next_day
. Permite pasar un argumento paraTime#prev_day
yTime#next_day
. (Commit)Agregar la misma firma de método para
Time#prev_month
yTime#next_month
de acuerdo conDate#prev_month
,Date#next_month
. Permite pasar un argumento paraTime#prev_month
yTime#next_month
. (Commit)Agregar la misma firma de método para
Time#prev_year
yTime#next_year
de acuerdo conDate#prev_year
,Date#next_year
. Permite pasar un argumento paraTime#prev_year
yTime#next_year
. (Commit)Corregir el soporte de acrónimos en
humanize
. (Commit)Permitir
Range#include?
en rangos TWZ. (Pull Request)Caché: Habilitar compresión de forma predeterminada para valores > 1kB. (Pull Request)
Almacenamiento de caché en Redis. (Pull Request, Pull Request)
Manejar errores de
TZInfo::AmbiguousTime
. (Pull Request)MemCacheStore: Soporte para expirar contadores. (Commit)
Hacer que
ActiveSupport::TimeZone.all
devuelva solo zonas horarias que estén enActiveSupport::TimeZone::MAPPING
. (Pull Request)Cambiar el comportamiento predeterminado de
ActiveSupport::SecurityUtils.secure_compare
, para que no se filtre información de longitud incluso para cadenas de longitud variable. Renombrar el antiguoActiveSupport::SecurityUtils.secure_compare
afixed_length_secure_compare
, y comenzar a generar unArgumentError
en caso de discrepancia de longitud de las cadenas pasadas. (Pull Request)Usar SHA-1 para generar resúmenes no sensibles, como el encabezado ETag. (Pull Request, Pull Request)
assert_changes
siempre afirmará que la expresión cambia, independientemente de las combinaciones de argumentosfrom:
yto:
. (Pull Request)Agregar instrumentación faltante para
read_multi
enActiveSupport::Cache::Store
. (Pull Request)Soporte de hash como primer argumento en
assert_difference
. Esto permite especificar múltiples diferencias numéricas en la misma afirmación. (Pull Request)Caché: Aceleración de
read_multi
yfetch_multi
en MemCache y Redis. Leer de la caché en memoria local antes de consultar el backend. (Commit)
10 Active Job
Consulte el registro de cambios para obtener cambios detallados.
10.1 Cambios destacados
- Permitir pasar un bloque a
ActiveJob::Base.discard_on
para permitir manejo personalizado de trabajos descartados. (Pull Request)
11 Ruby on Rails Guides
Consulte el registro de cambios para obtener cambios detallados.
11.1 Cambios destacados
Agregar Guía de subprocesos y ejecución de código en Rails. (Pull Request)
Agregar Descripción general de Active Storage Guía. (Pull Request)
12 Créditos
Consulte la lista completa de colaboradores de Rails para conocer a 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 encuentras algún error tipográfico o factual. Para empezar, puedes leer nuestra contribución a la documentación sección.
También puedes encontrar contenido incompleto o desactualizado. Por favor, añade cualquier documentación faltante para main. Asegúrate de revisar Edge Guides primero para verificar si los problemas ya están resueltos o no en la rama principal. Consulta las Directrices de las Guías de Ruby on Rails para el estilo y las convenciones.
Si por alguna razón encuentras algo que corregir pero no puedes solucionarlo tú mismo, por favor abre un problema.
Y por último, cualquier tipo de discusión sobre la documentación de Ruby on Rails es muy bienvenida en el Foro oficial de Ruby on Rails.