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

Notas de lanzamiento de Ruby on Rails 5.0

Aspectos destacados en Rails 5.0:

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 confirmaciones en el repositorio principal de Rails en GitHub.

1 Actualización a Rails 5.0

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 4.2 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.0. 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 Action Cable

Action Cable es un nuevo marco en Rails 5.0. Integra de manera transparente WebSockets con el resto de su aplicación Rails.

Action Cable permite escribir características en tiempo real en Ruby en el mismo estilo y forma que el resto de su aplicación Rails, al mismo tiempo que es eficiente y escalable. Es una oferta de pila completa que proporciona tanto un marco de JavaScript en el lado del cliente como un marco de Ruby en el lado del servidor. Tiene acceso a su modelo de dominio completo escrito con Active Record o su ORM de elección.

Consulte la guía Descripción general de Action Cable para obtener más información.

2.2 Aplicaciones API

Rails ahora se puede utilizar para crear aplicaciones API más reducidas. Esto es útil para crear y servir API similares a la de Twitter o GitHub, que se pueden utilizar para servir aplicaciones públicas, así como aplicaciones personalizadas.

Puede generar una nueva aplicación Rails API utilizando:

$ rails new my_api --api

Esto hará tres cosas principales:

  • Configurar su aplicación para que comience con un conjunto más limitado de middleware que lo normal. Específicamente, no incluirá ningún middleware principalmente útil para aplicaciones de navegador (como el soporte de cookies) de forma predeterminada.
  • Hacer que ApplicationController herede de ActionController::API en lugar de ActionController::Base. Al igual que con el middleware, esto omitirá cualquier módulo de Action Controller que proporcione funcionalidades utilizadas principalmente por aplicaciones de navegador.
  • Configurar los generadores para omitir la generación de vistas, ayudantes y activos cuando se genera un nuevo recurso.

La aplicación proporciona una base para API, que luego se puede configurar para incluir funcionalidad según las necesidades de la aplicación. Consulte la guía Usando Rails para aplicaciones solo de API para obtener más información.

2.3 API de atributos de Active Record

Define un atributo con un tipo en un modelo. Anulará el tipo de los atributos existentes si es necesario. Esto permite controlar cómo se convierten los valores hacia y desde SQL cuando se asignan a un modelo. También cambia el comportamiento de los valores pasados a ActiveRecord::Base.where, lo que nos permite usar nuestros objetos de dominio en gran parte de Active Record, sin tener que depender de detalles de implementación o parches de monkey.

Algunas cosas que se pueden lograr con esto:

  • Se puede anular el tipo detectado por Active Record.
  • También se puede proporcionar un valor predeterminado.
  • Los atributos no necesitan estar respaldados por una columna de base de datos.
# db/schema.rb
create_table :store_listings, force: true do |t|
  t.decimal :price_in_cents
  t.string :my_string, default: "original default"
end
# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
end
store_listing = StoreListing.new(price_in_cents: '10.1')

# antes
store_listing.price_in_cents # => BigDecimal.new(10.1)
StoreListing.new.my_string # => "original default"

class StoreListing < ActiveRecord::Base
  attribute :price_in_cents, :integer # tipo personalizado
  attribute :my_string, :string, default: "new default" # valor predeterminado
  attribute :my_default_proc, :datetime, default: -> { Time.now } # valor predeterminado
  attribute :field_without_db_column, :integer, array: true
end

# después
store_listing.price_in_cents # => 10
StoreListing.new.my_string # => "new default"
StoreListing.new.my_default_proc # => 2015-05-30 11:04:48 -0600
model = StoreListing.new(field_without_db_column: ["1", "2", "3"])
model.attributes # => {field_without_db_column: [1, 2, 3]}

Creando tipos personalizados:

Puede definir sus propios tipos personalizados, siempre y cuando respondan a los métodos definidos en el tipo de valor. El método deserialize o cast se llamará en su objeto de tipo, con la entrada sin procesar de la base de datos o de sus controladores. Esto es útil, por ejemplo, al hacer conversiones personalizadas, como datos de dinero.

Consulta:

Cuando se llama a ActiveRecord::Base.where, utilizará el tipo definido por la clase del modelo para convertir el valor a SQL, llamando a serialize en su objeto de tipo.

Esto le da a los objetos la capacidad de especificar cómo convertir valores al realizar consultas SQL.

Seguimiento de cambios:

El tipo de un atributo puede cambiar cómo se realiza el seguimiento de cambios. Consulte su documentación para obtener una descripción detallada.

2.4 Ejecutor de pruebas

Se ha introducido un nuevo ejecutor de pruebas para mejorar las capacidades de ejecución de pruebas en Rails. Para usar este ejecutor de pruebas, simplemente escriba bin/rails test.

El ejecutor de pruebas está inspirado en RSpec, minitest-reporters, maxitest y otros. Incluye algunos de estos avances destacados:

  • Ejecutar una sola prueba utilizando el número de línea de la prueba.
  • Ejecutar varias pruebas señalando al número de línea de las pruebas.
  • Mejora en los mensajes de error, que también facilitan la repetición de las pruebas fallidas.
  • Fallar rápidamente usando la opción -f, para detener las pruebas inmediatamente al producirse un fallo, en lugar de esperar a que se complete el conjunto de pruebas.
  • Retrasar la salida de las pruebas hasta el final de una ejecución completa de pruebas utilizando la opción -d.
  • Salida completa de la traza de excepción utilizando la opción -b.
  • Integración con minitest para permitir opciones como -s para datos de semilla de prueba, -n para ejecutar una prueba específica por nombre, -v para obtener una salida más detallada, y así sucesivamente.
  • Salida de prueba en color. Railties --------

Consulte el registro de cambios para obtener cambios detallados.

2.5 Eliminaciones

  • Se eliminó el soporte para el depurador, use byebug en su lugar. debugger no es compatible con Ruby 2.2. (commit)

  • Se eliminaron las tareas test:all y test:all:db obsoletas. (commit)

  • Se eliminó Rails::Rack::LogTailer obsoleto. (commit)

  • Se eliminó la constante RAILS_CACHE obsoleta. (commit)

  • Se eliminó la configuración obsoleta serve_static_assets. (commit)

  • Se eliminaron las tareas de documentación doc:app, doc:rails y doc:guides. (commit)

  • Se eliminó el middleware Rack::ContentLength de la pila predeterminada. (Commit)

2.6 Obsolescencias

  • Se deprecó config.static_cache_control a favor de config.public_file_server.headers. (Pull Request)

  • Se deprecó config.serve_static_files a favor de config.public_file_server.enabled. (Pull Request)

  • Se deprecó las tareas en el espacio de nombres de tareas rails a favor del espacio de nombres app. (por ejemplo, las tareas rails:update y rails:template se renombraron a app:update y app:template.) (Pull Request)

2.7 Cambios destacados

  • Se agregó el ejecutador de pruebas de Rails bin/rails test. (Pull Request)

  • Las aplicaciones y complementos recién generados obtienen un archivo README.md en formato Markdown. (commit, Pull Request)

  • Se agregó la tarea bin/rails restart para reiniciar su aplicación de Rails tocando tmp/restart.txt. (Pull Request)

  • Se agregó la tarea bin/rails initializers para imprimir todos los inicializadores definidos en el orden en que son invocados por Rails. (Pull Request)

  • Se agregó bin/rails dev:cache para habilitar o deshabilitar el almacenamiento en caché en el modo de desarrollo. (Pull Request)

  • Se agregó el script bin/update para actualizar automáticamente el entorno de desarrollo. (Pull Request)

  • Se realizaron tareas Rake a través de bin/rails. (Pull Request, Pull Request)

  • Las nuevas aplicaciones se generan con el monitor de sistema de archivos basado en eventos habilitado en Linux y macOS. La función se puede omitir pasando --skip-listen al generador. (commit, commit)

  • Generar aplicaciones con una opción para registrar en STDOUT en producción utilizando la variable de entorno RAILS_LOG_TO_STDOUT. (Pull Request)

  • Habilitar HSTS con el encabezado IncludeSubdomains para nuevas aplicaciones. (Pull Request)

  • El generador de aplicaciones escribe un nuevo archivo config/spring.rb, que le indica a Spring que observe archivos comunes adicionales. (commit)

  • Se agregó --skip-action-mailer para omitir Action Mailer al generar una nueva aplicación. (Pull Request)

  • Se eliminó el directorio tmp/sessions y la tarea de borrado asociada. (Pull Request)

  • Se cambió _form.html.erb generado por el generador de andamios para usar variables locales. (Pull Request)

  • Se desactivó la carga automática de clases en el entorno de producción. (commit)

3 Action Pack

Consulte el registro de cambios para obtener cambios detallados.

3.1 Eliminaciones

  • Se eliminó ActionDispatch::Request::Utils.deep_munge. (commit)

  • Se eliminó ActionController::HideActions. (Pull Request)

  • Se eliminaron los métodos de marcador de posición respond_to y respond_with, esta funcionalidad se ha extraído a la gema responders. (commit)

  • Se eliminaron los archivos de aserción obsoletos. (commit)

  • Se eliminó el uso obsoleto de claves de cadena en los ayudantes de URL. (commit)

  • Se eliminó la opción obsoleta only_path en los ayudantes *_path. (commit)

  • Se eliminó NamedRouteCollection#helpers obsoleto. (commit)

  • Se eliminó el soporte obsoleto para definir rutas con la opción :to que no contiene #. (commit)

  • Se eliminó ActionDispatch::Response#to_ary obsoleto. (commit)

  • Se eliminó ActionDispatch::Request#deep_munge obsoleto. (commit)

  • Se eliminó ActionDispatch::Http::Parameters#symbolized_path_parameters obsoleto. (commit)

  • Se eliminó la opción obsoleta use_route en las pruebas de controladores. (commit)

  • Se eliminaron assigns y assert_template. Ambos métodos se han extraído en la gema rails-controller-testing . (Pull Request)

3.2 Deprecaciones

  • Se deprecó todos los callbacks *_filter a favor de los callbacks *_action. (Pull Request)

  • Se deprecó los métodos de prueba de integración *_via_redirect. Use follow_redirect! manualmente después de la llamada de la solicitud para el mismo comportamiento. (Pull Request)

  • Se deprecó AbstractController#skip_action_callback a favor de métodos individuales skip_callback. (Pull Request)

  • Se deprecó la opción :nothing para el método render. (Pull Request)

  • Se deprecó pasar el primer parámetro como Hash y el código de estado predeterminado para el método head. (Pull Request)

  • Se deprecó el uso de cadenas o símbolos para los nombres de clase de middleware. Use nombres de clase en su lugar. (commit)

  • Se deprecó el acceso a los tipos MIME a través de constantes (por ejemplo, Mime::HTML). Use el operador de subíndice con un símbolo en su lugar (por ejemplo, Mime[:html]). (Pull Request)

  • Se deprecó redirect_to :back a favor de redirect_back, que acepta un argumento fallback_location requerido, eliminando así la posibilidad de un RedirectBackError. (Pull Request)

  • ActionDispatch::IntegrationTest y ActionController::TestCase deprecian los argumentos posicionales a favor de argumentos de palabras clave. (Pull Request)

  • Se deprecó los parámetros de ruta :controller y :action. (Pull Request)

  • Se deprecó el método env en las instancias de controlador. (commit)

  • ActionDispatch::ParamsParser está obsoleto y se eliminó de la pila de middleware. Para configurar los analizadores de parámetros, use ActionDispatch::Request.parameter_parsers=. (commit, commit)

3.3 Cambios destacados

  • Se agregó ActionController::Renderer para renderizar plantillas arbitrarias fuera de las acciones del controlador. (Pull Request)

  • Migración a la sintaxis de argumentos de palabras clave en ActionController::TestCase y métodos de solicitud HTTP de ActionDispatch::Integration. (Pull Request)

  • Se agregó http_cache_forever a Action Controller, para que podamos almacenar en caché una respuesta que nunca caduca. (Pull Request)

  • Proporcionar un acceso más amigable a las variantes de solicitud. (Pull Request)

  • Para acciones sin plantillas correspondientes, renderizar head :no_content en lugar de generar un error. (Pull Request)

  • Se agregó la capacidad de anular el generador de formularios predeterminado para un controlador. (Pull Request)

  • Se agregó soporte para aplicaciones solo de API. ActionController::API se agrega como reemplazo de ActionController::Base para este tipo de aplicaciones. (Pull Request)

  • ActionController::Parameters ya no hereda de HashWithIndifferentAccess. (Pull Request)

  • Se facilita la opción de habilitar config.force_ssl y config.ssl_options al hacerlos menos peligrosos de probar y más fáciles de deshabilitar. (Pull Request)

  • Se agregó la capacidad de devolver encabezados arbitrarios a ActionDispatch::Static. (Pull Request)

  • Se cambió el valor predeterminado de protect_from_forgery a false. (commit)

  • ActionController::TestCase se moverá a su propia gema en Rails 5.1. En su lugar, use ActionDispatch::IntegrationTest. (commit)

  • Rails genera ETags débiles de forma predeterminada. (Pull Request)

  • Las acciones del controlador sin una llamada explícita a render y sin plantillas correspondientes renderizarán implícitamente head :no_content en lugar de generar un error. (Pull Request 1, 2)

  • Se agregó una opción para tokens CSRF por formulario. (Pull Request)

  • Se agregó la codificación de solicitud y el análisis de respuesta a las pruebas de integración. (Pull Request)

  • Agregue ActionController#helpers para acceder al contexto de la vista a nivel de controlador. (Pull Request)

  • Los mensajes flash descartados se eliminan antes de almacenarlos en la sesión. (Pull Request)

  • Se agregó soporte para pasar una colección de registros a fresh_when y stale?. (Pull Request)

  • ActionController::Live se convirtió en un ActiveSupport::Concern. Esto significa que no se puede incluir en otros módulos sin extenderlos con ActiveSupport::Concern o ActionController::Live no tendrá efecto en producción. Algunas personas también pueden estar usando otro módulo para incluir algún código especial de manejo de fallas de autenticación Warden/Devise, ya que el middleware no puede capturar un :warden lanzado por un hilo generado, que es el caso cuando se usa ActionController::Live. (Más detalles en este problema)

  • Introducir Response#strong_etag= y #weak_etag= y opciones análogas para fresh_when y stale?. (Pull Request)

4 Action View

Consulte el Changelog para obtener cambios detallados.

4.1 Eliminaciones

  • Se eliminó AbstractController::Base::parent_prefixes en desuso. (commit)

  • Se eliminó ActionView::Helpers::RecordTagHelper, esta funcionalidad se ha extraído a la gema record_tag_helper. (Pull Request)

  • Se eliminó la opción :rescue_format para el ayudante translate ya que ya no es compatible con I18n. (Pull Request)

4.2 Cambios destacados

  • Se cambió el controlador de plantillas predeterminado de ERB a Raw. (commit)

  • La representación de colecciones puede almacenar en caché y recuperar múltiples parciales a la vez. (Pull Request, commit)

  • Se agregó la coincidencia de comodines a las dependencias explícitas. (Pull Request)

  • Hacer que disable_with sea el comportamiento predeterminado para las etiquetas de envío. Deshabilita el botón al enviar para evitar envíos duplicados. (Pull Request)

  • El nombre de la plantilla parcial ya no tiene que ser un identificador válido de Ruby. (commit)

  • El ayudante datetime_tag ahora genera una etiqueta de entrada con el tipo datetime-local. (Pull Request)

  • Permitir bloques al renderizar con el ayudante render partial:. (Pull Request)

5 Action Mailer

Consulte el Changelog para obtener cambios detallados.

5.1 Eliminaciones

  • Se eliminaron los ayudantes *_path en desuso en las vistas de correo electrónico. (commit)

  • Se eliminaron los métodos deliver y deliver! en desuso. (commit)

5.2 Cambios destacados

  • La búsqueda de plantillas ahora respeta el idioma predeterminado y las opciones de fallback de I18n. (commit)

  • Se agregó el sufijo _mailer a los mailers creados mediante el generador, siguiendo la misma convención de nomenclatura utilizada en los controladores y trabajos. (Pull Request)

  • Agregado assert_enqueued_emails y assert_no_enqueued_emails. (Pull Request)

  • Agregada la configuración config.action_mailer.deliver_later_queue_name para establecer el nombre de la cola del mailer. (Pull Request)

  • Agregado soporte para el fragment caching en las vistas de Action Mailer. Agregada la nueva opción de configuración config.action_mailer.perform_caching para determinar si las plantillas deben realizar caching o no. (Pull Request)

6 Active Record

Por favor, consulta el Changelog para obtener cambios detallados.

6.1 Eliminaciones

  • Eliminado el comportamiento obsoleto que permitía pasar matrices anidadas como valores de consulta. (Pull Request)

  • Eliminado ActiveRecord::Tasks::DatabaseTasks#load_schema, que estaba obsoleto. Este método fue reemplazado por ActiveRecord::Tasks::DatabaseTasks#load_schema_for. (commit)

  • Eliminado serialized_attributes, que estaba obsoleto. (commit)

  • Eliminado el contador automático obsoleto en has_many :through. (commit)

  • Eliminado sanitize_sql_hash_for_conditions, que estaba obsoleto. (commit)

  • Eliminado Reflection#source_macro, que estaba obsoleto. (commit)

  • Eliminados symbolized_base_class y symbolized_sti_name, que estaban obsoletos. (commit)

  • Eliminado ActiveRecord::Base.disable_implicit_join_references=, que estaba obsoleto. (commit)

  • Eliminado el acceso obsoleto a la especificación de conexión utilizando un accessor de cadena. (commit)

  • Eliminado el soporte obsoleto para precargar asociaciones dependientes de la instancia. (commit)

  • Eliminado el soporte obsoleto para rangos de PostgreSQL con límites inferiores exclusivos. (commit)

  • Eliminada la deprecación al modificar una relación con Arel en caché. Esto ahora genera un error ImmutableRelation. (commit)

  • Eliminado ActiveRecord::Serialization::XmlSerializer del núcleo. Esta funcionalidad se ha extraído al activemodel-serializers-xml gema. (Pull Request)

  • Eliminado el soporte para el adaptador de base de datos mysql heredado del núcleo. La mayoría de los usuarios deberían poder usar mysql2. Se convertirá en una gema separada cuando encontremos a alguien que lo mantenga. (Pull Request 1, Pull Request 2)

  • Eliminado el soporte para la gema protected_attributes. (commit)

  • Eliminado el soporte para versiones de PostgreSQL anteriores a 9.1. (Pull Request)

  • Eliminado el soporte para la gema activerecord-deprecated_finders. (commit)

  • Eliminada la constante ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES. (commit)

6.2 Deprecaciones

  • Deprecado pasar una clase como valor en una consulta. Los usuarios deben pasar cadenas en su lugar. (Pull Request)

  • Deprecado devolver false como forma de detener las cadenas de callback de Active Record. La forma recomendada es usar throw(:abort). (Pull Request)

  • Deprecado ActiveRecord::Base.errors_in_transactional_callbacks=. (commit)

  • Deprecado el uso de Relation#uniq, usar Relation#distinct en su lugar. (commit)

  • Deprecado el tipo PostgreSQL :point a favor de uno nuevo que devolverá objetos Point en lugar de un Array. (Pull Request)

  • Deprecado recargar la asociación forzando un argumento verdadero al método de asociación. (Pull Request)

  • Deprecados los nombres de clave para los errores de restrict_dependent_destroy de la asociación en favor de nuevos nombres de clave. (Pull Request)

  • Sincronizado el comportamiento de #tables. (Pull Request)

  • Deprecado SchemaCache#tables, SchemaCache#table_exists? y SchemaCache#clear_table_cache! en favor de sus contrapartes de origen de datos. (Pull Request)

  • Deprecado connection.tables en los adaptadores SQLite3 y MySQL. (Pull Request)

  • Deprecado pasar argumentos a #tables - el método #tables de algunos adaptadores (mysql2, sqlite3) devolvería tanto tablas como vistas, mientras que otros (postgresql) solo devuelven tablas. Para hacer que su comportamiento sea consistente, #tables solo devolverá tablas en el futuro. (Pull Request)

  • Obsoleto table_exists? - El método #table_exists? verificaba tanto las tablas como las vistas. Para que su comportamiento sea consistente con #tables, en el futuro #table_exists? solo verificará las tablas. (Pull Request)

  • Obsoleto el envío del argumento offset a find_nth. Por favor, use el método offset en la relación en su lugar. (Pull Request)

  • Obsoletos {insert|update|delete}_sql en DatabaseStatements. Use los métodos públicos {insert|update|delete} en su lugar. (Pull Request)

  • Obsoleto use_transactional_fixtures en favor de use_transactional_tests para mayor claridad. (Pull Request)

  • Obsoleto pasar una columna a ActiveRecord::Connection#quote. (commit)

  • Se agregó una opción end a find_in_batches que complementa el parámetro start para especificar dónde detener el procesamiento por lotes. (Pull Request)

6.3 Cambios destacados

  • Se agregó la opción foreign_key a references al crear la tabla. (commit)

  • Nueva API de atributos. (commit)

  • Se agregó la opción :_prefix/:_suffix a la definición de enum. (Pull Request, Pull Request)

  • Se agregó #cache_key a ActiveRecord::Relation. (Pull Request)

  • Se cambió el valor predeterminado de null para timestamps a false. (commit)

  • Se agregó ActiveRecord::SecureToken para encapsular la generación de tokens únicos para atributos en un modelo usando SecureRandom. (Pull Request)

  • Se agregó la opción :if_exists para drop_table. (Pull Request)

  • Se agregó ActiveRecord::Base#accessed_fields, que se puede usar para descubrir rápidamente qué campos se leyeron de un modelo cuando se busca seleccionar solo los datos necesarios de la base de datos. (commit)

  • Se agregó el método #or a ActiveRecord::Relation, que permite usar el operador OR para combinar cláusulas WHERE o HAVING. (commit)

  • Se agregó ActiveRecord::Base.suppress para evitar que el receptor se guarde durante el bloque dado. (Pull Request)

  • belongs_to ahora generará un error de validación de forma predeterminada si la asociación no está presente. Puede desactivar esto por asociación con optional: true. También se deprecia la opción required en favor de optional para belongs_to. (Pull Request)

  • Se agregó config.active_record.dump_schemas para configurar el comportamiento de db:structure:dump. (Pull Request)

  • Se agregó la opción config.active_record.warn_on_records_fetched_greater_than. (Pull Request)

  • Se agregó soporte nativo para el tipo de datos JSON en MySQL. (Pull Request)

  • Se agregó soporte para eliminar índices concurrentemente en PostgreSQL. (Pull Request)

  • Se agregaron los métodos #views y #view_exists? en los adaptadores de conexión. (Pull Request)

  • Se agregó ActiveRecord::Base.ignored_columns para hacer que algunas columnas sean invisibles para Active Record. (Pull Request)

  • Se agregaron los métodos connection.data_sources y connection.data_source_exists?. Estos métodos determinan qué relaciones se pueden utilizar para respaldar los modelos de Active Record (generalmente tablas y vistas). (Pull Request)

  • Los archivos de fixtures ahora pueden establecer la clase del modelo en el propio archivo YAML. (Pull Request)

  • Se agregó la capacidad de utilizar uuid como clave primaria de forma predeterminada al generar migraciones de base de datos. (Pull Request)

  • Agregado ActiveRecord::Relation#left_joins y ActiveRecord::Relation#left_outer_joins. (Pull Request)

  • Agregados callbacks after_{create,update,delete}_commit. (Pull Request)

  • Versionado de la API presentada a las clases de migración, para poder cambiar los valores predeterminados de los parámetros sin romper las migraciones existentes, ni forzar a que sean reescritas a través de un ciclo de deprecación. (Pull Request)

  • ApplicationRecord es una nueva superclase para todos los modelos de la aplicación, análoga a los controladores de la aplicación que heredan de ApplicationController en lugar de ActionController::Base. Esto proporciona a las aplicaciones un único lugar para configurar el comportamiento de los modelos en toda la aplicación. (Pull Request)

  • Agregados los métodos #second_to_last y #third_to_last a ActiveRecord. (Pull Request)

  • Agregada la capacidad de anotar objetos de la base de datos (tablas, columnas, índices) con comentarios almacenados en los metadatos de la base de datos para PostgreSQL y MySQL. (Pull Request)

  • Agregado soporte para prepared statements en el adaptador mysql2, para mysql2 0.4.4+. Anteriormente, esto solo era compatible con el adaptador heredado mysql en desuso. Para habilitarlo, establezca prepared_statements: true en config/database.yml. (Pull Request)

  • Agregada la capacidad de llamar al método ActionRecord::Relation#update en objetos de relación, lo que ejecutará validaciones y callbacks en todos los objetos de la relación. (Pull Request)

  • Agregada la opción :touch al método save para que los registros se puedan guardar sin actualizar las marcas de tiempo. (Pull Request)

  • Agregado soporte para índices de expresiones y clases de operadores en PostgreSQL. (commit)

  • Agregada la opción :index_errors para agregar índices a los errores de atributos anidados. (Pull Request)

  • Agregado soporte para dependencias de eliminación bidireccionales. (Pull Request)

  • Agregado soporte para callbacks after_commit en pruebas transaccionales. (Pull Request)

  • Agregado el método foreign_key_exists? para verificar si una clave foránea existe en una tabla o no. (Pull Request)

  • Agregada la opción :time al método touch para tocar registros con una hora diferente a la hora actual. (Pull Request)

  • Cambiados los callbacks de transacción para no ocultar errores. Antes de este cambio, cualquier error generado dentro de un callback de transacción era rescatado e impreso en los registros, a menos que se usara la opción (recién deprecada) raise_in_transactional_callbacks = true. Ahora, estos errores ya no son rescatados y simplemente se propagan, coincidiendo con el comportamiento de otros callbacks. (commit)

7 Active Model

Consulte el Changelog para obtener cambios detallados.

7.1 Eliminaciones

  • Eliminados los métodos obsoletos ActiveModel::Dirty#reset_#{attribute} y ActiveModel::Dirty#reset_changes. (Pull Request)

  • Eliminada la serialización XML. Esta característica se ha extraído a la gema activemodel-serializers-xml. (Pull Request)

  • Eliminado el módulo ActionController::ModelNaming. (Pull Request)

7.2 Deprecaciones

  • Deprecado el retorno de false como forma de detener las cadenas de callbacks de Active Model y ActiveModel::Validations. La forma recomendada es usar throw(:abort). (Pull Request)

  • Deprecados los métodos ActiveModel::Errors#get, ActiveModel::Errors#set y ActiveModel::Errors#[]= que tienen un comportamiento inconsistente. (Pull Request)

  • Deprecada la opción :tokenizer para validates_length_of, a favor de Ruby puro. (Pull Request)

  • Se ha eliminado ActiveModel::Errors#add_on_empty y ActiveModel::Errors#add_on_blank sin reemplazo. (Pull Request)

7.3 Cambios destacados

  • Se ha agregado ActiveModel::Errors#details para determinar qué validador ha fallado. (Pull Request)

  • Se ha extraído ActiveRecord::AttributeAssignment a ActiveModel::AttributeAssignment permitiendo su uso para cualquier objeto como un módulo incluible. (Pull Request)

  • Se han agregado ActiveModel::Dirty#[attr_name]_previously_changed? y ActiveModel::Dirty#[attr_name]_previous_change para mejorar el acceso a los cambios registrados después de que el modelo ha sido guardado. (Pull Request)

  • Se validan múltiples contextos en valid? e invalid? a la vez. (Pull Request)

  • Se ha cambiado validates_acceptance_of para aceptar true como valor predeterminado además de 1. (Pull Request)

8 Active Job

Consulte el registro de cambios para obtener cambios detallados.

8.1 Cambios destacados

  • ActiveJob::Base.deserialize delega a la clase de trabajo. Esto permite que los trabajos adjunten metadatos arbitrarios cuando se serializan y los lean cuando se realizan. (Pull Request)

  • Se agrega la capacidad de configurar el adaptador de cola en cada trabajo sin afectar a los demás. (Pull Request)

  • Ahora, un trabajo generado hereda de app/jobs/application_job.rb de forma predeterminada. (Pull Request)

  • Se permite que DelayedJob, Sidekiq, qu, que y queue_classic informen el ID del trabajo a ActiveJob::Base como provider_job_id. (Pull Request, Pull Request, commit)

  • Se implementa un procesador de AsyncJob simple y un AsyncAdapter asociado que encola trabajos en un grupo de hilos de concurrent-ruby. (Pull Request)

  • Se cambia el adaptador predeterminado de en línea a asíncrono. Es una mejor opción ya que las pruebas no dependerán erróneamente de un comportamiento que ocurre de forma sincrónica. (commit)

9 Active Support

Consulte el registro de cambios para obtener cambios detallados.

9.1 Eliminaciones

  • Se ha eliminado ActiveSupport::JSON::Encoding::CircularReferenceError obsoleto. (commit)

  • Se han eliminado los métodos obsoletos ActiveSupport::JSON::Encoding.encode_big_decimal_as_string= y ActiveSupport::JSON::Encoding.encode_big_decimal_as_string. (commit)

  • Se ha eliminado ActiveSupport::SafeBuffer#prepend obsoleto. (commit)

  • Se han eliminado los métodos obsoletos de Kernel. silence_stderr, silence_stream, capture y quietly. (commit)

  • Se ha eliminado el archivo obsoleto active_support/core_ext/big_decimal/yaml_conversions. (commit)

  • Se han eliminado los métodos obsoletos ActiveSupport::Cache::Store.instrument y ActiveSupport::Cache::Store.instrument=. (commit)

  • Se ha eliminado Class#superclass_delegating_accessor obsoleto. Use Class#class_attribute en su lugar. (Pull Request)

  • Se ha eliminado ThreadSafe::Cache. Use Concurrent::Map en su lugar. (Pull Request)

  • Se ha eliminado Object#itself ya que está implementado en Ruby 2.2. (Pull Request)

9.2 Deprecaciones

  • Se ha deprecado MissingSourceFile a favor de LoadError. (commit)

  • Se ha deprecado alias_method_chain en favor de Module#prepend introducido en Ruby 2.0. (Pull Request)

  • Se ha deprecado ActiveSupport::Concurrency::Latch a favor de Concurrent::CountDownLatch de concurrent-ruby. (Pull Request)

  • Se ha deprecado la opción :prefix de number_to_human_size sin reemplazo. (Pull Request)

  • Se ha deprecado Module#qualified_const_ en favor de los métodos integrados Module#const_. (Pull Request)

  • Se ha deprecado pasar una cadena para definir un callback. (Pull Request)

  • Se ha deprecado ActiveSupport::Cache::Store#namespaced_key, ActiveSupport::Cache::MemCachedStore#escape_key y ActiveSupport::Cache::FileStore#key_file_path. Use normalize_key en su lugar. (Pull Request, commit)

  • Se ha deprecado ActiveSupport::Cache::LocaleCache#set_cache_value a favor de write_cache_value. (Pull Request)

  • Se ha dejado de recomendar pasar argumentos a assert_nothing_raised. (Pull Request)

  • Se ha dejado de recomendar Module.local_constants en favor de Module.constants(false). (Pull Request)

9.3 Cambios destacados

  • Se han agregado los métodos #verified y #valid_message? a ActiveSupport::MessageVerifier. (Pull Request)

  • Se ha cambiado la forma en que se pueden detener las cadenas de callbacks. El método preferido para detener una cadena de callbacks a partir de ahora es lanzar explícitamente throw(:abort). (Pull Request)

  • Nueva opción de configuración config.active_support.halt_callback_chains_on_return_false para especificar si las cadenas de callbacks de ActiveRecord, ActiveModel y ActiveModel::Validations pueden detenerse al devolver false en un callback 'before'. (Pull Request)

  • Se ha cambiado el orden de prueba predeterminado de :sorted a :random. (commit)

  • Se han agregado los métodos #on_weekend?, #on_weekday?, #next_weekday, #prev_weekday a Date, Time y DateTime. (Pull Request, Pull Request)

  • Se ha agregado la opción same_time a #next_week y #prev_week para Date, Time, y DateTime. (Pull Request)

  • Se han agregado los métodos #prev_day y #next_day como contrapartes de #yesterday y #tomorrow para Date, Time y DateTime. (Pull Request)

  • Se ha agregado SecureRandom.base58 para generar cadenas aleatorias en base58. (commit)

  • Se ha agregado file_fixture a ActiveSupport::TestCase. Proporciona un mecanismo sencillo para acceder a archivos de muestra en tus casos de prueba. (Pull Request)

  • Se ha agregado #without a Enumerable y Array para devolver una copia de un enumerable sin los elementos especificados. (Pull Request)

  • Se ha agregado ActiveSupport::ArrayInquirer y Array#inquiry. (Pull Request)

  • Se ha agregado ActiveSupport::TimeZone#strptime para permitir el análisis de horas como si fueran de una zona horaria dada. (commit)

  • Se han agregado los métodos de consulta Integer#positive? y Integer#negative? en la línea de Integer#zero?. (commit)

  • Se ha agregado una versión con exclamación a los métodos de obtención de ActiveSupport::OrderedOptions que lanzará un KeyError si el valor es .blank?. (Pull Request)

  • Se ha agregado Time.days_in_year para devolver el número de días en el año dado, o el año actual si no se proporciona ningún argumento. (commit)

  • Se ha agregado un observador de archivos con eventos para detectar de forma asíncrona cambios en el código fuente de la aplicación, rutas, locales, etc. (Pull Request)

  • Se han agregado los métodos thread_m/cattr_accessor/reader/writer para declarar variables de clase y módulo que viven por hilo. (Pull Request)

  • Se han agregado los métodos Array#second_to_last y Array#third_to_last. (Pull Request)

  • Se han publicado las APIs ActiveSupport::Executor y ActiveSupport::Reloader para permitir que componentes y bibliotecas administren y participen en la ejecución de código de aplicación y el proceso de recarga de la aplicación. (Pull Request)

  • ActiveSupport::Duration ahora admite el formato y análisis ISO8601. (Pull Request)

  • ActiveSupport::JSON.decode ahora admite el análisis de horas locales ISO8601 cuando parse_json_times está habilitado. (Pull Request)

  • ActiveSupport::JSON.decode ahora devuelve objetos Date para cadenas de fecha. (Pull Request)

  • Se ha agregado la capacidad de TaggedLogging para permitir que los registradores se instancien múltiples veces para que no compartan etiquetas entre sí. (Pull Request)

    Créditos

Consulte la lista completa de colaboradores de Rails para conocer a las muchas personas que dedicaron muchas horas para 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.