1 Actualizando a Rails 4.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 4.1 en caso de que no lo haya hecho y asegurarse de que su aplicación siga funcionando como se espera antes de intentar actualizar a Rails 4.2. Una lista de cosas a tener en cuenta al actualizar está disponible en la guía Actualizando Ruby on Rails.
2 Características Principales
2.1 Active Job
Active Job es un nuevo framework en Rails 4.2. Es una interfaz común sobre los sistemas de encolamiento como Resque, Delayed Job, Sidekiq y más.
Los trabajos escritos con la API de Active Job se ejecutan en cualquiera de las colas compatibles gracias a sus adaptadores respectivos. Active Job viene preconfigurado con un ejecutor en línea que ejecuta los trabajos de inmediato.
A menudo, los trabajos necesitan tomar objetos de Active Record como argumentos. Active Job pasa referencias de objetos como URIs (identificadores uniformes de recursos) en lugar de serializar el objeto en sí. La nueva biblioteca Global ID construye URIs y busca los objetos a los que hacen referencia. Pasar objetos de Active Record como argumentos de trabajo funciona simplemente utilizando Global ID internamente.
Por ejemplo, si trashable
es un objeto de Active Record, entonces este trabajo se ejecuta sin problemas sin necesidad de serialización:
class TrashableCleanupJob < ActiveJob::Base
def perform(trashable, depth)
trashable.cleanup(depth)
end
end
Consulte la guía Conceptos Básicos de Active Job para obtener más información.
2.2 Correos Asíncronos
Basándose en Active Job, Action Mailer ahora viene con un método deliver_later
que envía correos electrónicos a través de la cola, por lo que no bloquea el controlador o el modelo si la cola es asíncrona (la cola en línea predeterminada bloquea).
Todavía es posible enviar correos electrónicos de inmediato con deliver_now
.
2.3 Adequate Record
Adequate Record es un conjunto de mejoras de rendimiento en Active Record que hace que las llamadas comunes de find
y find_by
y algunas consultas de asociación sean hasta 2 veces más rápidas.
Funciona almacenando en caché las consultas SQL comunes como declaraciones preparadas y reutilizándolas en llamadas similares, omitiendo la mayor parte del trabajo de generación de consultas en llamadas posteriores. Para obtener más detalles, consulte la publicación del blog de Aaron Patterson (en inglés).
Active Record aprovechará automáticamente esta función en operaciones compatibles sin ninguna participación del usuario ni cambios en el código. Aquí hay algunos ejemplos de operaciones compatibles:
Post.find(1) # La primera llamada genera y almacena en caché la declaración preparada
Post.find(2) # Las llamadas posteriores reutilizan la declaración preparada en caché
Post.find_by_title('primer post')
Post.find_by_title('segundo post')
Post.find_by(title: 'primer post')
Post.find_by(title: 'segundo post')
post.comments
post.comments(true)
Es importante destacar que, como sugieren los ejemplos anteriores, las declaraciones preparadas no almacenan en caché los valores pasados en las llamadas de método; en su lugar, tienen marcadores de posición para ellos.
La caché no se utiliza en los siguientes escenarios:
- El modelo tiene un ámbito predeterminado
- El modelo utiliza herencia de tabla única
find
con una lista de ids, por ejemplo:# no se almacena en caché Post.find(1, 2, 3) Post.find([1,2])
find_by
con fragmentos de SQL:Post.find_by('published_at < ?', 2.semanas.ago)
2.4 Web Console
Las nuevas aplicaciones generadas con Rails 4.2 ahora vienen con la gema Web Console de forma predeterminada. Web Console agrega una consola interactiva de Ruby en cada página de error y proporciona una vista y ayudantes de controlador console
.
La consola interactiva en las páginas de error le permite ejecutar código en el contexto del lugar donde se originó la excepción. El ayudante console
, si se llama en cualquier vista o controlador, inicia una consola interactiva con el contexto final, una vez que se haya completado la representación.
2.5 Soporte para claves foráneas
El DSL de migración ahora admite agregar y eliminar claves foráneas. También se incluyen en schema.rb
. En este momento, solo los adaptadores mysql
, mysql2
y postgresql
admiten claves foráneas.
# agregar una clave foránea a `articles.author_id` que referencia `authors.id`
add_foreign_key :articles, :authors
# agregar una clave foránea a `articles.author_id` que referencia `users.lng_id`
add_foreign_key :articles, :users, column: :author_id, primary_key: "lng_id"
# eliminar la clave foránea en `accounts.branch_id`
remove_foreign_key :accounts, :branches
# eliminar la clave foránea en `accounts.owner_id`
remove_foreign_key :accounts, column: :owner_id
Consulte la documentación de la API en add_foreign_key y remove_foreign_key para obtener una descripción completa.
3 Incompatibilidades
Se ha eliminado la funcionalidad previamente deprecada. Consulte los componentes individuales para conocer las nuevas deprecaciones en esta versión.
Los siguientes cambios pueden requerir una acción inmediata al actualizar.
3.1 render
con un argumento de tipo String
Anteriormente, llamar a render "foo/bar"
en una acción del controlador era equivalente a render file: "foo/bar"
. En Rails 4.2, esto ha cambiado para significar render template: "foo/bar"
. Si necesita renderizar un archivo, cambie su código para usar la forma explícita (render file: "foo/bar"
) en su lugar.
3.2 respond_with
/ respond_to
a nivel de clase
respond_with
y el correspondiente respond_to
a nivel de clase se han movido al gem responders. Agregue gem 'responders', '~> 2.0'
a su Gemfile
para usarlo:
# app/controllers/users_controller.rb
class UsersController < ApplicationController
respond_to :html, :json
def show
@user = User.find(params[:id])
respond_with @user
end
end
El respond_to
a nivel de instancia no se ve afectado:
# app/controllers/users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
respond_to do |format|
format.html
format.json { render json: @user }
end
end
end
3.3 Host predeterminado para rails server
Debido a un cambio en Rack, rails server
ahora escucha en localhost
en lugar de 0.0.0.0
de forma predeterminada. Esto debería tener un impacto mínimo en el flujo de trabajo de desarrollo estándar, ya que tanto http://127.0.0.1:3000 como http://localhost:3000 seguirán funcionando como antes en su propia máquina.
Sin embargo, con este cambio ya no podrá acceder al servidor de Rails desde una máquina diferente, por ejemplo, si su entorno de desarrollo está en una máquina virtual y desea acceder a ella desde la máquina host. En estos casos, inicie el servidor con rails server -b 0.0.0.0
para restaurar el comportamiento anterior.
Si hace esto, asegúrese de configurar correctamente su firewall para que solo las máquinas confiables en su red puedan acceder a su servidor de desarrollo.
3.4 Cambio en los símbolos de opción de estado para render
Debido a un cambio en Rack, los símbolos que el método render
acepta para la opción :status
han cambiado:
- 306: se ha eliminado
:reserved
. - 413:
:request_entity_too_large
se ha cambiado a:payload_too_large
. - 414:
:request_uri_too_long
se ha cambiado a:uri_too_long
. - 416:
:requested_range_not_satisfiable
se ha cambiado a:range_not_satisfiable
.
Tenga en cuenta que si llama a render
con un símbolo desconocido, el estado de respuesta será 500 de forma predeterminada.
3.5 Sanitizador de HTML
El sanitizador de HTML se ha reemplazado por una nueva implementación más robusta basada en Loofah y Nokogiri. El nuevo sanitizador es más seguro y su sanitización es más potente y flexible.
Debido al nuevo algoritmo, la salida sanitizada puede ser diferente para ciertas entradas patológicas.
Si tiene una necesidad particular de la salida exacta del antiguo sanitizador, puede agregar el gem rails-deprecated_sanitizer a su Gemfile
para tener el comportamiento antiguo. El gem no emite advertencias de deprecación porque es opcional.
rails-deprecated_sanitizer
será compatible solo con Rails 4.2; no se mantendrá para Rails 5.0.
Consulte esta publicación de blog para obtener más detalles sobre los cambios en el nuevo sanitizador.
3.6 assert_select
assert_select
ahora se basa en Nokogiri. Como resultado, algunos selectores que antes eran válidos ahora no son compatibles. Si su aplicación está utilizando alguna de estas formas de escritura, deberá actualizarlas:
* Los valores en los selectores de atributos pueden necesitar comillas si contienen caracteres no alfanuméricos.
```ruby
# antes
a[href=/]
a[href$=/]
# ahora
a[href="/"]
a[href$="/"]
```
Los DOM construidos a partir de código fuente HTML que contiene HTML inválido con elementos anidados incorrectamente pueden diferir.
Por ejemplo:
# contenido: <div><i><p></i></div> # antes: assert_select('div > i') # => true assert_select('div > p') # => false assert_select('i > p') # => true # ahora: assert_select('div > i') # => true assert_select('div > p') # => true assert_select('i > p') # => false
Si los datos seleccionados contienen entidades, el valor seleccionado para la comparación solía ser sin procesar (por ejemplo,
AT&T
), y ahora se evalúa (por ejemplo,AT&T
).# contenido: <p>AT&T</p> # antes: assert_select('p', 'AT&T') # => true assert_select('p', 'AT&T') # => false # ahora: assert_select('p', 'AT&T') # => true assert_select('p', 'AT&T') # => false
Además, las sustituciones han cambiado de sintaxis.
Ahora tienes que usar un selector :match
similar a CSS:
assert_select ":match('id', ?)", 'comment_1'
Además, las sustituciones de expresiones regulares se ven diferentes cuando la afirmación falla.
Observa cómo /hello/
aquí:
assert_select(":match('id', ?)", /hello/)
se convierte en "(?-mix:hello)"
:
Se esperaba encontrar al menos 1 elemento que coincida con "div:match('id', "(?-mix:hello)")", se encontraron 0.
Se esperaba que 0 fuera >= 1.
Consulta la documentación de Rails Dom Testing para obtener más información sobre assert_select
.
4 Railties
Consulta el Changelog para obtener cambios detallados.
4.1 Eliminaciones
La opción
--skip-action-view
se ha eliminado del generador de aplicaciones. (Pull Request)El comando
rails application
se ha eliminado sin reemplazo. (Pull Request)
4.2 Deprecaciones
Se ha deprecado la falta de
config.log_level
para entornos de producción. (Pull Request)Se ha deprecado
rake test:all
a favor derake test
, ya que ahora ejecuta todas las pruebas en la carpetatest
. (Pull Request)Se ha deprecado
rake test:all:db
a favor derake test:db
. (Pull Request)Se ha deprecado
Rails::Rack::LogTailer
sin reemplazo. (Commit)
4.3 Cambios destacados
Se introdujo
web-console
en el archivoGemfile
de la aplicación por defecto. (Pull Request)Se agregó una opción
required
al generador de modelos para asociaciones. (Pull Request)Se introdujo el espacio de nombres
x
para definir opciones de configuración personalizadas:# config/environments/production.rb config.x.payment_processing.schedule = :daily config.x.payment_processing.retries = 3 config.x.super_debugger = true
Estas opciones están disponibles a través del objeto de configuración:
Rails.configuration.x.payment_processing.schedule # => :daily Rails.configuration.x.payment_processing.retries # => 3 Rails.configuration.x.super_debugger # => true
(Commit)
Se introdujo
Rails::Application.config_for
para cargar una configuración para el entorno actual.# config/exception_notification.yml production: url: http://127.0.0.1:8080 namespace: my_app_production development: url: http://localhost:3001 namespace: my_app_development
# config/environments/production.rb Rails.application.configure do config.middleware.use ExceptionNotifier, config_for(:exception_notification) end
Se introdujo la opción
--skip-turbolinks
en el generador de aplicaciones para no generar la integración de turbolinks. (Commit)Se introdujo el script
bin/setup
como una convención para el código de configuración automatizado al iniciar una aplicación. (Pull Request)Se cambió el valor predeterminado de
config.assets.digest
atrue
en desarrollo. (Pull Request)Se introdujo una API para registrar nuevas extensiones para
rake notes
. (Pull Request)Se introdujo un callback
after_bundle
para usar en plantillas de Rails. (Pull Request)Se introdujo
Rails.gem_version
como un método de conveniencia para devolverGem::Version.new(Rails.version)
. (Pull Request)
5 Action Pack
Consulta el Changelog para obtener cambios detallados.
5.1 Eliminaciones
respond_with
yrespond_to
a nivel de clase se han eliminado de Rails y se han movido a la gemaresponders
(versión 2.0). Agregagem 'responders', '~> 2.0'
a tuGemfile
para seguir utilizando estas características. (Pull Request, Más detalles)Se eliminó
AbstractController::Helpers::ClassMethods::MissingHelperError
en desuso a favor deAbstractController::Helpers::MissingHelperError
. (Commit)
5.2 Deprecaciones
Se ha deprecado la opción
only_path
en los ayudantes*_path
. (Commit)Se ha deprecado
assert_tag
,assert_no_tag
,find_tag
yfind_all_tag
en favor deassert_select
. (Commit)Se ha deprecado el soporte para establecer la opción
:to
de un enrutador como un símbolo o una cadena que no contiene el carácter "#":get '/posts', to: MyRackApp => (No es necesario cambiar) get '/posts', to: 'post#index' => (No es necesario cambiar) get '/posts', to: 'posts' => get '/posts', controller: :posts get '/posts', to: :index => get '/posts', action: :index
(Commit)
Se ha deprecado el soporte para claves de cadena en los ayudantes de URL:
# malo root_path('controller' => 'posts', 'action' => 'index') # bueno root_path(controller: 'posts', action: 'index')
5.3 Cambios destacados
Se han eliminado los métodos de la familia
*_filter
de la documentación. Se desaconseja su uso a favor de los métodos de la familia*_action
:after_filter => after_action append_after_filter => append_after_action append_around_filter => append_around_action append_before_filter => append_before_action around_filter => around_action before_filter => before_action prepend_after_filter => prepend_after_action prepend_around_filter => prepend_around_action prepend_before_filter => prepend_before_action skip_after_filter => skip_after_action skip_around_filter => skip_around_action skip_before_filter => skip_before_action skip_filter => skip_action_callback
Si tu aplicación depende actualmente de estos métodos, debes usar los métodos de reemplazo
*_action
en su lugar. Estos métodos serán deprecados en el futuro y eventualmente serán eliminados de Rails.render nothing: true
o renderizar un cuerponil
ya no añade un espacio en blanco al cuerpo de la respuesta. (Pull Request)Rails ahora incluye automáticamente el hash del template en las ETags. (Pull Request)
Los segmentos que se pasan a los ayudantes de URL ahora se escapan automáticamente. (Commit)
Se introdujo la opción
always_permitted_parameters
para configurar qué parámetros están permitidos globalmente. El valor predeterminado de esta configuración es['controller', 'action']
. (Pull Request)Se agregó el método HTTP
MKCALENDAR
de RFC 4791. (Pull Request)Las notificaciones
*_fragment.action_controller
ahora incluyen el nombre del controlador y la acción en la carga útil. (Pull Request)Se mejoró la página de error de enrutamiento con una búsqueda difusa de rutas. (Pull Request)
Se agregó una opción para deshabilitar el registro de fallos de CSRF. (Pull Request)
Cuando el servidor de Rails está configurado para servir activos estáticos, los activos gzip ahora se sirven si el cliente lo admite y hay un archivo gzip pregenerado (
.gz
) en el disco. Por defecto, el pipeline de activos genera archivos.gz
para todos los activos compresibles. Servir archivos gzip minimiza la transferencia de datos y acelera las solicitudes de activos. Siempre usa un CDN si estás sirviendo activos desde tu servidor de Rails en producción. (Pull Request)Al llamar a los ayudantes
process
en una prueba de integración, la ruta debe tener una barra diagonal inicial. Anteriormente se podía omitir, pero eso era un subproducto de la implementación y no una característica intencional, por ejemplo:test "list all posts" do get "/posts" assert_response :success end
6 Action View
Consulta el Changelog para ver los cambios detallados.
6.1 Deprecaciones
Se ha deprecado
AbstractController::Base.parent_prefixes
. SobrescribeAbstractController::Base.local_prefixes
cuando quieras cambiar dónde encontrar las vistas. (Pull Request)Se ha deprecado
ActionView::Digestor#digest(name, format, finder, options = {})
. Los argumentos deben pasarse como un hash en su lugar. (Pull Request)
6.2 Cambios destacados
render "foo/bar"
ahora se expande arender template: "foo/bar"
en lugar derender file: "foo/bar"
. (Pull Request)Los ayudantes de formulario ya no generan un elemento
<div>
con CSS en línea alrededor de los campos ocultos. (Pull Request)Se introdujo una variable local especial
#{partial_name}_iteration
para usar con parciales que se renderizan con una colección. Proporciona acceso al estado actual de la iteración a través de los métodosindex
,size
,first?
ylast?
. (Pull Request)La traducción de marcadores de posición sigue la misma convención que la traducción de
label
. (Pull Request)
7 Action Mailer
Consulta el Changelog para ver los cambios detallados.
7.1 Deprecaciones
Se han deprecado los ayudantes
*_path
en los mailers. Siempre usa los ayudantes*_url
en su lugar. (Pull Request)Se han deprecado
deliver
/deliver!
a favor dedeliver_now
/deliver_now!
. (Pull Request)
7.2 Cambios destacados
link_to
yurl_for
generan URLs absolutas de forma predeterminada en las plantillas, ya no es necesario pasaronly_path: false
. (Commit)Se introdujo
deliver_later
que encola un trabajo en la cola de la aplicación para enviar correos electrónicos de forma asíncrona. (Pull Request)Se agregó la opción de configuración
show_previews
para habilitar las vistas previas de mailers fuera del entorno de desarrollo. (Pull Request)Active Record
Consulte el registro de cambios para obtener cambios detallados.
7.3 Eliminaciones
Se eliminó
cache_attributes
y amigos. Todos los atributos están en caché. (Pull Request)Se eliminó el método obsoleto
ActiveRecord::Base.quoted_locking_column
. (Pull Request)Se eliminó
ActiveRecord::Migrator.proper_table_name
obsoleto. En su lugar, use el método de instanciaproper_table_name
enActiveRecord::Migration
. (Pull Request)Se eliminó el tipo
:timestamp
no utilizado. Se le asigna automáticamente el alias:datetime
en todos los casos. Soluciona inconsistencias cuando los tipos de columna se envían fuera de Active Record, como para la serialización XML. (Pull Request)
7.4 Obsolescencias
Se obsoletó la supresión de errores dentro de
after_commit
yafter_rollback
. (Pull Request)Se obsoletó el soporte defectuoso para la detección automática de cachés de contador en asociaciones
has_many :through
. En su lugar, debe especificar manualmente la caché de contador en las asociacioneshas_many
ybelongs_to
para los registros a través de. (Pull Request)Se obsoletó pasar objetos de Active Record a
.find
o.exists?
. Llame primero aid
en los objetos. (Commit 1, 2)Se obsoletó el soporte a medias para valores de rango de PostgreSQL con comienzos excluidos. Actualmente mapeamos los rangos de PostgreSQL a rangos de Ruby. Esta conversión no es completamente posible porque los rangos de Ruby no admiten comienzos excluidos.
La solución actual de incrementar el comienzo no es correcta y ahora está obsoleta. Para subtipos donde no sabemos cómo incrementar (por ejemplo,
succ
no está definido), generará unArgumentError
para rangos con comienzos excluidos. (Commit)Se obsoletó llamar a
DatabaseTasks.load_schema
sin una conexión. UseDatabaseTasks.load_schema_current
en su lugar. (Commit)Se obsoletó
sanitize_sql_hash_for_conditions
sin reemplazo. Usar unRelation
para realizar consultas y actualizaciones es la API preferida. (Commit)Se obsoletó
add_timestamps
yt.timestamps
sin pasar la opción:null
. El valor predeterminado denull: true
cambiará en Rails 5 anull: false
. (Pull Request)Se obsoletó
Reflection#source_macro
sin reemplazo, ya que ya no es necesario en Active Record. (Pull Request)Se obsoletó
serialized_attributes
sin reemplazo. (Pull Request)Se obsoletó devolver
nil
desdecolumn_for_attribute
cuando no existe una columna. Devolverá un objeto nulo en Rails 5.0. (Pull Request)Se obsoletó usar
.joins
,.preload
y.eager_load
con asociaciones que dependen del estado de la instancia (es decir, aquellas definidas con un ámbito que toma un argumento) sin reemplazo. (Commit)
7.5 Cambios destacados
SchemaDumper
utilizaforce: :cascade
encreate_table
. Esto permite recargar un esquema cuando hay claves externas en su lugar.Se agregó la opción
:required
a las asociaciones singulares, que define una validación de presencia en la asociación. (Pull Request)ActiveRecord::Dirty
ahora detecta cambios en el lugar en valores mutables. Los atributos serializados en modelos de Active Record ya no se guardan cuando no han cambiado. Esto también funciona con otros tipos como columnas de cadena y columnas json en PostgreSQL. (Pull Requests 1, 2, 3)Se introdujo la tarea Rake
db:purge
para vaciar la base de datos del entorno actual. (Commit)Se introdujo
ActiveRecord::Base#validate!
que genera una excepciónActiveRecord::RecordInvalid
si el registro no es válido. (Pull Request)Se introdujo
validate
como un alias paravalid?
. (Pull Request)touch
ahora acepta múltiples atributos para ser actualizados al mismo tiempo. (Pull Request)El adaptador PostgreSQL ahora admite el tipo de dato
jsonb
en PostgreSQL 9.4+. (Pull Request)Los adaptadores PostgreSQL y SQLite ya no agregan un límite predeterminado de 255 caracteres en columnas de cadena. (Pull Request)
Se agregó soporte para el tipo de columna
citext
en el adaptador PostgreSQL. (Pull Request)Se agregó soporte para tipos de rango creados por el usuario en el adaptador PostgreSQL. (Commit)
sqlite3:///some/path
ahora se resuelve a la ruta absoluta del sistema/some/path
. Para rutas relativas, usesqlite3:some/path
en su lugar. (Anteriormente,sqlite3:///some/path
se resolvía a la ruta relativasome/path
. Este comportamiento fue obsoleto en Rails 4.1). (Pull Request)Se agregó soporte para segundos fraccionarios para MySQL 5.6 y superior. (Pull Request 1, 2)
Se agregó
ActiveRecord::Base#pretty_print
para imprimir modelos de forma legible. (Pull Request)ActiveRecord::Base#reload
ahora se comporta igual quem = Model.find(m.id)
, lo que significa que ya no conserva los atributos adicionales deSELECT
personalizados. (Pull Request)ActiveRecord::Base#reflections
ahora devuelve un hash con claves de tipo string en lugar de claves de tipo símbolo. (Pull Request)El método
references
en las migraciones ahora admite una opcióntype
para especificar el tipo de la clave foránea (por ejemplo,:uuid
). (Pull Request)
8 Active Model
Consulte el registro de cambios para obtener cambios detallados.
8.1 Eliminaciones
- Se eliminó el método
Validator#setup
obsoleto sin reemplazo. (Pull Request)
8.2 Obsolescencias
Se ha vuelto obsoleto el método
reset_#{attribute}
en favor derestore_#{attribute}
. (Pull Request)Se ha vuelto obsoleto
ActiveModel::Dirty#reset_changes
en favor declear_changes_information
. (Pull Request)
8.3 Cambios destacados
Se introdujo
validate
como un alias devalid?
. (Pull Request)Se introdujo el método
restore_attributes
enActiveModel::Dirty
para restaurar los atributos modificados (sucios) a sus valores anteriores. (Pull Request 1, 2)has_secure_password
ya no impide contraseñas en blanco (es decir, contraseñas que contienen solo espacios) de forma predeterminada. (Pull Request)has_secure_password
ahora verifica que la contraseña proporcionada tenga menos de 72 caracteres si las validaciones están habilitadas. (Pull Request)
9 Active Support
Consulte el registro de cambios para obtener cambios detallados.
9.1 Eliminaciones
Se eliminaron los métodos obsoletos
Numeric#ago
,Numeric#until
,Numeric#since
,Numeric#from_now
. (Commit)Se eliminaron los terminadores basados en cadenas obsoletos para
ActiveSupport::Callbacks
. (Pull Request)
9.2 Obsolescencias
Se ha vuelto obsoleto
Kernel#silence_stderr
,Kernel#capture
yKernel#quietly
sin reemplazo. (Pull Request)Se ha vuelto obsoleto
Class#superclass_delegating_accessor
, useClass#class_attribute
en su lugar. (Pull Request)Se ha vuelto obsoleto
ActiveSupport::SafeBuffer#prepend!
ya queActiveSupport::SafeBuffer#prepend
ahora realiza la misma función. (Pull Request)
9.3 Cambios destacados
Se introdujo una nueva opción de configuración
active_support.test_order
para especificar el orden en que se ejecutan los casos de prueba. Esta opción actualmente tiene un valor predeterminado de:sorted
, pero se cambiará a:random
en Rails 5.0. (Commit)Object#try
yObject#try!
ahora se pueden usar sin un receptor explícito en el bloque. (Commit, Pull Request)El ayudante de prueba
travel_to
ahora trunca el componenteusec
a 0. (Commit)Se introdujo
Object#itself
como una función de identidad. (Commit 1, 2)Object#with_options
ahora se puede usar sin un receptor explícito en el bloque. (Pull Request)Se introdujo
String#truncate_words
para truncar una cadena por un número de palabras. (Pull Request)Se agregaron
Hash#transform_values
yHash#transform_values!
para simplificar un patrón común en el que los valores de un hash deben cambiar, pero las claves se mantienen iguales. (Pull Request)El ayudante de inflexión
humanize
ahora elimina cualquier guión bajo inicial. (Commit)Se introdujo
Concern#class_methods
como una alternativa amodule ClassMethods
, así comoKernel#concern
para evitar la plantillamodule Foo; extend ActiveSupport::Concern; end
. (Commit)Nueva guía sobre la carga automática y recarga de constantes.
10 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 hoy. 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.