1 Actualización a Rails 5.1
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.0 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.1. 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 Soporte para Yarn
Rails 5.1 permite administrar las dependencias de JavaScript desde npm a través de Yarn. Esto facilitará el uso de bibliotecas como React, VueJS o cualquier otra biblioteca del mundo npm. El soporte para Yarn está integrado con el pipeline de activos para que todas las dependencias funcionen sin problemas con la aplicación Rails 5.1.
2.2 Soporte opcional para Webpack
Las aplicaciones Rails pueden integrarse más fácilmente con Webpack, un empaquetador de activos de JavaScript, utilizando la nueva gema Webpacker. Use la bandera --webpack
al generar nuevas aplicaciones para habilitar la integración de Webpack.
Esto es totalmente compatible con el pipeline de activos, que aún puede usar para imágenes, fuentes, sonidos y otros activos. Incluso puede tener parte del código JavaScript administrado por el pipeline de activos y otro código procesado a través de Webpack. Todo esto es gestionado por Yarn, que está habilitado de forma predeterminada.
2.3 jQuery ya no es una dependencia predeterminada
jQuery era requerido de forma predeterminada en versiones anteriores de Rails para proporcionar características como data-remote
, data-confirm
y otras partes de las ofertas de JavaScript no intrusivas de Rails. Ya no es necesario, ya que el UJS se ha reescrito para usar JavaScript plano. Este código ahora se envía dentro de Action View como rails-ujs
.
Todavía puede usar jQuery si es necesario, pero ya no es necesario de forma predeterminada.
2.4 Pruebas de sistema
Rails 5.1 tiene soporte integrado para escribir pruebas de Capybara, en forma de pruebas de sistema. Ya no es necesario preocuparse por configurar Capybara y las estrategias de limpieza de la base de datos para este tipo de pruebas. Rails 5.1 proporciona un envoltorio para ejecutar pruebas en Chrome con características adicionales como capturas de pantalla de fallos.
2.5 Secretos encriptados
Rails ahora permite gestionar los secretos de la aplicación de manera segura, inspirado en la gema sekrets.
Ejecuta bin/rails secrets:setup
para configurar un nuevo archivo de secretos encriptados. Esto también generará una clave maestra, que debe almacenarse fuera del repositorio. Los propios secretos pueden ser guardados de forma segura en el sistema de control de versiones, en forma encriptada.
Los secretos se desencriptarán en producción, utilizando una clave almacenada en la variable de entorno RAILS_MASTER_KEY
o en un archivo de clave.
2.6 Mailers parametrizados
Permite especificar parámetros comunes utilizados para todos los métodos en una clase de mailer, con el fin de compartir variables de instancia, encabezados y otras configuraciones comunes.
class InvitationsMailer < ApplicationMailer
before_action { @inviter, @invitee = params[:inviter], params[:invitee] }
before_action { @account = params[:inviter].account }
def account_invitation
mail subject: "#{@inviter.name} te invitó a su Basecamp (#{@account.name})"
end
end
InvitationsMailer.with(inviter: person_a, invitee: person_b)
.account_invitation.deliver_later
2.7 Rutas directas y resueltas
Rails 5.1 agrega dos nuevos métodos, resolve
y direct
, al DSL de enrutamiento. El método resolve
permite personalizar la asignación polimórfica de modelos.
resource :basket
resolve("Basket") { [:basket] }
<%= form_for @basket do |form| %>
<!-- formulario del basket -->
<% end %>
Esto generará la URL singular /basket
en lugar de la habitual /baskets/:id
.
El método direct
permite crear helpers de URL personalizados.
direct(:homepage) { "https://rubyonrails.org" }
homepage_url # => "https://rubyonrails.org"
El valor de retorno del bloque debe ser un argumento válido para el método url_for
. Por lo tanto, puedes pasar una cadena URL válida, un Hash, un Array, una instancia de Active Model o una clase de Active Model.
direct :commentable do |model|
[ model, anchor: model.dom_id ]
end
direct :main do
{ controller: 'pages', action: 'index', subdomain: 'www' }
end
2.8 Unificación de form_for y form_tag en form_with
Antes de Rails 5.1, había dos interfaces para manejar formularios HTML: form_for
para instancias de modelos y form_tag
para URLs personalizadas.
Rails 5.1 combina ambas interfaces con form_with
y puede generar etiquetas de formulario basadas en URLs, ámbitos o modelos.
Usando solo una URL:
<%= form_with url: posts_path do |form| %>
<%= form.text_field :title %>
<% end %>
<%# Generará %>
<form action="/posts" method="post" data-remote="true">
<input type="text" name="title">
</form>
Agregar un ámbito agrega un prefijo a los nombres de los campos de entrada:
<%= form_with scope: :post, url: posts_path do |form| %>
<%= form.text_field :title %>
<% end %>
<%# Generará %>
<form action="/posts" method="post" data-remote="true">
<input type="text" name="post[title]">
</form>
Usar un modelo implica tanto la URL como el alcance:
<%= form_with model: Post.new do |form| %>
<%= form.text_field :title %>
<% end %>
<%# Generará %>
<form action="/posts" method="post" data-remote="true">
<input type="text" name="post[title]">
</form>
Un modelo existente crea un formulario de actualización y completa los valores de los campos:
<%= form_with model: Post.first do |form| %>
<%= form.text_field :title %>
<% end %>
<%# Generará %>
<form action="/posts/1" method="post" data-remote="true">
<input type="hidden" name="_method" value="patch">
<input type="text" name="post[title]" value="<el título del post>">
</form>
3 Incompatibilidades
Los siguientes cambios pueden requerir una acción inmediata al actualizar.
3.1 Pruebas transaccionales con múltiples conexiones
Las pruebas transaccionales ahora envuelven todas las conexiones de Active Record en transacciones de base de datos.
Cuando una prueba genera hilos adicionales y esos hilos obtienen conexiones de base de datos, esas conexiones ahora se manejan de manera especial:
Los hilos compartirán una única conexión, que está dentro de la transacción administrada. Esto asegura que todos los hilos vean la base de datos en el mismo estado, ignorando la transacción más externa. Anteriormente, estas conexiones adicionales no podían ver las filas de los fixtures, por ejemplo.
Cuando un hilo entra en una transacción anidada, obtendrá temporalmente el uso exclusivo de la conexión para mantener el aislamiento.
Si tus pruebas actualmente dependen de obtener una conexión separada fuera de la transacción en un hilo generado, deberás cambiar a un manejo de conexión más explícito.
Si tus pruebas generan hilos y esos hilos interactúan mientras también usan transacciones de base de datos explícitas, este cambio puede introducir un bloqueo.
La forma fácil de optar por no utilizar este nuevo comportamiento es desactivar las pruebas transaccionales en los casos de prueba que afecte.
4 Railties
Por favor, consulta el registro de cambios para obtener cambios detallados.
4.1 Eliminaciones
Eliminar
config.static_cache_control
obsoleto. (commit)Eliminar
config.serve_static_files
obsoleto. (commit)Eliminar archivo obsoleto
rails/rack/debugger
. (commit)Eliminar tareas obsoletas:
rails:update
,rails:template
,rails:template:copy
,rails:update:configs
yrails:update:bin
. (commit)Eliminar variable de entorno
CONTROLLER
obsoleta para la tarearoutes
. (commit)Eliminar opción -j (--javascript) del comando
rails new
. (Pull Request)
4.2 Cambios destacados
Agregar una sección compartida a
config/secrets.yml
que se cargará para todos los entornos. (commit)El archivo de configuración
config/secrets.yml
ahora se carga con todas las claves como símbolos. (Pull Request)Eliminar jquery-rails de la pila predeterminada. rails-ujs, que se incluye con Action View, se incluye como adaptador UJS predeterminado. (Pull Request)
Agregar soporte para Yarn en nuevas aplicaciones con un binstub de yarn y package.json. (Pull Request)
Agregar soporte para Webpack en nuevas aplicaciones a través de la opción
--webpack
, que delegará en la gema rails/webpacker. (Pull Request)Inicializar el repositorio Git al generar una nueva aplicación, si no se proporciona la opción
--skip-git
. (Pull Request)Agregar secretos encriptados en
config/secrets.yml.enc
. (Pull Request)Mostrar el nombre de la clase Railtie en los inicializadores de Rails. (Pull Request)
5 Action Cable
Consulte el registro de cambios para obtener cambios detallados.
5.1 Cambios destacados
Se agregó soporte para
channel_prefix
en los adaptadores Redis y Redis con eventos encable.yml
para evitar colisiones de nombres al usar el mismo servidor Redis con múltiples aplicaciones. (Pull Request)Se agregó un gancho
ActiveSupport::Notifications
para transmitir datos. (Pull Request)
6 Action Pack
Consulte el registro de cambios para obtener cambios detallados.
6.1 Eliminaciones
Se eliminó el soporte para argumentos no clave en
#process
,#get
,#post
,#patch
,#put
,#delete
y#head
para las clasesActionDispatch::IntegrationTest
yActionController::TestCase
. (Commit, Commit)Se eliminaron los métodos obsoletos
ActionDispatch::Callbacks.to_prepare
yActionDispatch::Callbacks.to_cleanup
. (Commit)Se eliminaron los métodos obsoletos relacionados con los filtros del controlador. (Commit)
Se eliminó el soporte obsoleto para
:text
y:nothing
enrender
. (Commit, Commit)Se eliminó el soporte obsoleto para llamar a los métodos de
HashWithIndifferentAccess
enActionController::Parameters
. (Commit)
6.2 Obsolescencias
- Se ha marcado como obsoleto
config.action_controller.raise_on_unfiltered_parameters
. No tiene ningún efecto en Rails 5.1. (Commit)
6.3 Cambios destacados
Se agregaron los métodos
direct
yresolve
a DSL de enrutamiento. (Pull Request)Se agregó una nueva clase
ActionDispatch::SystemTestCase
para escribir pruebas de sistema en sus aplicaciones. (Pull Request)
7 Action View
Consulte el registro de cambios para obtener cambios detallados.
7.1 Eliminaciones
Se eliminó
#original_exception
obsoleto enActionView::Template::Error
. (commit)Se eliminó la opción
encode_special_chars
mal nombrada destrip_tags
. (Pull Request)
7.2 Obsolescencias
- Se ha marcado como obsoleto el manejador ERB de Erubis en favor de Erubi. (Pull Request)
7.3 Cambios destacados
El manejador de plantillas Raw (el manejador de plantillas predeterminado en Rails 5) ahora muestra cadenas seguras para HTML. (commit)
Cambiar
datetime_field
ydatetime_field_tag
para generar camposdatetime-local
. (Pull Request)Nueva sintaxis de estilo Builder para etiquetas HTML (
tag.div
,tag.br
, etc.). (Pull Request)Agregar
form_with
para unificar el uso deform_tag
yform_for
. (Pull Request)Agregar la opción
check_parameters
acurrent_page?
. (Pull Request)
8 Action Mailer
Consulte el registro de cambios para obtener cambios detallados.
8.1 Cambios destacados
Permitir establecer un tipo de contenido personalizado cuando se incluyen archivos adjuntos y se establece el cuerpo en línea. (Pull Request)
Permitir pasar lambdas como valores al método
default
. (Commit)Agregar soporte para invocación parametrizada de mailers para compartir filtros y valores predeterminados entre diferentes acciones de mailer. (Commit)
Pasar los argumentos entrantes a la acción del mailer al evento
process.action_mailer
bajo una claveargs
. (Pull Request)
9 Active Record
Consulte el registro de cambios para obtener cambios detallados.
9.1 Eliminaciones
Se eliminó el soporte para pasar argumentos y bloque al mismo tiempo a
ActiveRecord::QueryMethods#select
. (Commit)Se eliminaron los ámbitos de internacionalización
activerecord.errors.messages.restrict_dependent_destroy.one
yactiverecord.errors.messages.restrict_dependent_destroy.many
que estaban en desuso. (Commit)Se eliminó el argumento de recarga forzada en los lectores de asociación singular y de colección que estaban en desuso. (Commit)
Se eliminó el soporte de pasar una columna a
#quote
que estaba en desuso. (Commit)Se eliminaron los argumentos
name
en#tables
que estaban en desuso. (Commit)Se eliminó el comportamiento en desuso de
#tables
y#table_exists?
para devolver solo tablas y no vistas. (Commit)Se eliminó el argumento
original_exception
enActiveRecord::StatementInvalid#initialize
yActiveRecord::StatementInvalid#original_exception
que estaba en desuso. (Commit)Se eliminó el soporte en desuso de pasar una clase como valor en una consulta. (Commit)
Se eliminó el soporte en desuso para consultar usando comas en LIMIT. (Commit)
Se eliminó el parámetro
conditions
en#destroy_all
que estaba en desuso. (Commit)Se eliminó el parámetro
conditions
en#delete_all
que estaba en desuso. (Commit)Se eliminó el método en desuso
#load_schema_for
a favor de#load_schema
. (Commit)Se eliminó la configuración
#raise_in_transactional_callbacks
que estaba en desuso. (Commit)Se eliminó la configuración
#use_transactional_fixtures
que estaba en desuso. (Commit)
9.2 Deprecaciones
Se deprecó la bandera
error_on_ignored_order_or_limit
a favor deerror_on_ignored_order
. (Commit)Se deprecó
sanitize_conditions
a favor desanitize_sql
. (Pull Request)Se deprecó
supports_migrations?
en los adaptadores de conexión. (Pull Request)Se deprecó
Migrator.schema_migrations_table_name
, usarSchemaMigration.table_name
en su lugar. (Pull Request)Se deprecó el uso de
#quoted_id
en la cita y conversión de tipos. (Pull Request)Se deprecó pasar el argumento
default
a#index_name_exists?
. (Pull Request)
9.3 Cambios destacados
Se cambió la clave primaria predeterminada a BIGINT. (Pull Request)
Soporte para columnas virtuales/generadas en MySQL 5.7.5+ y MariaDB 5.2.0+. (Commit)
Se agregó soporte para límites en el procesamiento por lotes. (Commit)
Las pruebas transaccionales ahora envuelven todas las conexiones de Active Record en transacciones de base de datos. (Pull Request)
Se omiten los comentarios en la salida del comando
mysqldump
de forma predeterminada. (Pull Request)Se corrigió
ActiveRecord::Relation#count
para usarEnumerable#count
de Ruby para contar registros cuando se pasa un bloque como argumento en lugar de ignorar silenciosamente el bloque pasado. (Pull Request)Se pasa la bandera
"-v ON_ERROR_STOP=1"
con el comandopsql
para no suprimir los errores de SQL. (Pull Request)Se agregó
ActiveRecord::Base.connection_pool.stat
. (Pull Request)Generar una excepción cuando la asociación
through
tiene un nombre de reflexión ambiguo. (Commit)
10 Active Model
Consulte el registro de cambios para obtener cambios detallados.
10.1 Eliminaciones
Se eliminaron los métodos en desuso en
ActiveModel::Errors
. (commit)Se eliminó la opción
:tokenizer
en el validador de longitud que estaba en desuso. (commit)Se eliminó el comportamiento en desuso que detiene las devoluciones de llamada cuando el valor de retorno es falso. (commit)
10.2 Cambios destacados
- La cadena original asignada a un atributo del modelo ya no se congela incorrectamente. (Pull Request) Active Job -----------
Consulte el registro de cambios para obtener cambios detallados.
10.3 Eliminaciones
Se eliminó el soporte obsoleto para pasar la clase de adaptador a
.queue_adapter
. (commit)Se eliminó
#original_exception
obsoleto enActiveJob::DeserializationError
. (commit)
10.4 Cambios destacados
Se agregó manejo declarativo de excepciones a través de
ActiveJob::Base.retry_on
yActiveJob::Base.discard_on
. (Pull Request)Se devuelve la instancia del trabajo para que tenga acceso a cosas como
job.arguments
en la lógica personalizada después de que fallan los reintentos. (commit)
11 Active Support
Consulte el registro de cambios para obtener cambios detallados.
11.1 Eliminaciones
Se eliminó la clase
ActiveSupport::Concurrency::Latch
. (Commit)Se eliminó
halt_callback_chains_on_return_false
. (Commit)Se eliminó el comportamiento obsoleto que detiene las devoluciones de llamada cuando el retorno es falso. (Commit)
11.2 Deprecaciones
La clase
HashWithIndifferentAccess
de nivel superior ha sido suavemente deprecada a favor deActiveSupport::HashWithIndifferentAccess
. (Pull Request)Se deprecó pasar una cadena a las opciones condicionales
:if
y:unless
enset_callback
yskip_callback
. (Commit)
11.3 Cambios destacados
Se corrigió el análisis de duración y el desplazamiento para que sea consistente en los cambios de DST. (Commit, Pull Request)
Se actualizó Unicode a la versión 9.0.0. (Pull Request)
Se agregaron
Duration#before
y#after
como alias de#ago
y#since
. (Pull Request)Se agregó
Module#delegate_missing_to
para delegar llamadas de método no definidas para el objeto actual a un objeto proxy. (Pull Request)Se agregó
Date#all_day
que devuelve un rango que representa todo el día de la fecha y hora actual. (Pull Request)Se introdujeron los métodos
assert_changes
yassert_no_changes
para pruebas. (Pull Request)Los métodos
travel
ytravel_to
ahora generan un error en llamadas anidadas. (Pull Request)Se actualizó
DateTime#change
para admitir usec y nsec. (Pull Request)
12 Créditos
Consulte la lista completa de colaboradores de Rails para las muchas personas que pasaron muchas horas haciendo 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.