edge
Más en rubyonrails.org: Más Ruby on Rails

Notas de lanzamiento de Ruby on Rails 5.1

Aspectos destacados en Rails 5.1:

Estas notas de lanzamiento solo cubren los cambios principales. Para conocer las diversas correcciones de errores y cambios, consulte los registros de cambios o revise la lista de commits en el repositorio principal de Rails en GitHub.

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

Solicitud de extracción

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

Solicitud de extracción

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

Solicitud de extracción

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

Solicitud de extracción

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

Solicitud de extracción

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

Solicitud de extracción

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

Solicitud de extracción

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

Solicitud de extracción

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 y rails:update:bin. (commit)

  • Eliminar variable de entorno CONTROLLER obsoleta para la tarea routes. (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 en cable.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 clases ActionDispatch::IntegrationTest y ActionController::TestCase. (Commit, Commit)

  • Se eliminaron los métodos obsoletos ActionDispatch::Callbacks.to_prepare y ActionDispatch::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 en render. (Commit, Commit)

  • Se eliminó el soporte obsoleto para llamar a los métodos de HashWithIndifferentAccess en ActionController::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 y resolve 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 en ActionView::Template::Error. (commit)

  • Se eliminó la opción encode_special_chars mal nombrada de strip_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 y datetime_field_tag para generar campos datetime-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 de form_tag y form_for. (Pull Request)

  • Agregar la opción check_parameters a current_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 clave args. (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 y activerecord.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 en ActiveRecord::StatementInvalid#initialize y ActiveRecord::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 de error_on_ignored_order. (Commit)

  • Se deprecó sanitize_conditions a favor de sanitize_sql. (Pull Request)

  • Se deprecó supports_migrations? en los adaptadores de conexión. (Pull Request)

  • Se deprecó Migrator.schema_migrations_table_name, usar SchemaMigration.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 usar Enumerable#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 comando psql 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 en ActiveJob::DeserializationError. (commit)

10.4 Cambios destacados

  • Se agregó manejo declarativo de excepciones a través de ActiveJob::Base.retry_on y ActiveJob::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 de ActiveSupport::HashWithIndifferentAccess. (Pull Request)

  • Se deprecó pasar una cadena a las opciones condicionales :if y :unless en set_callback y skip_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 y assert_no_changes para pruebas. (Pull Request)

  • Los métodos travel y travel_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.