1 Actualización a Rails 4.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 4.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 4.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 Precargador de aplicaciones Spring
Spring es un precargador de aplicaciones Rails. Acelera el desarrollo al mantener su aplicación en ejecución en segundo plano para que no tenga que iniciarla cada vez que ejecuta una prueba, tarea de rake o migración.
Las nuevas aplicaciones Rails 4.1 se enviarán con binstubs "springificados". Esto significa que bin/rails
y bin/rake
aprovecharán automáticamente los entornos de spring precargados.
Ejecutar tareas de rake:
$ bin/rake test:models
Ejecutar un comando de Rails:
$ bin/rails console
Introspección de Spring:
$ bin/spring status
Spring se está ejecutando:
1182 spring server | my_app | iniciado hace 29 minutos
3656 spring app | my_app | iniciado hace 23 segundos | modo de prueba
3746 spring app | my_app | iniciado hace 10 segundos | modo de desarrollo
Eche un vistazo al README de Spring para ver todas las características disponibles.
Consulte la guía Actualización de Ruby on Rails sobre cómo migrar aplicaciones existentes para usar esta función.
2.2 config/secrets.yml
Rails 4.1 genera un nuevo archivo secrets.yml
en la carpeta config
. Por defecto, este archivo contiene la secret_key_base
de la aplicación, pero también se puede utilizar para almacenar otros secretos como claves de acceso para API externas.
Los secretos agregados a este archivo son accesibles a través de Rails.application.secrets
. Por ejemplo, con el siguiente config/secrets.yml
:
development:
secret_key_base: 3b7cd727ee24e8444053437c36cc66c3
some_api_key: SOMEKEY
Rails.application.secrets.some_api_key
devuelve SOMEKEY
en el entorno de desarrollo.
Consulte la guía Actualización de Ruby on Rails sobre cómo migrar aplicaciones existentes para usar esta función.
2.3 Variantes de Action Pack
A menudo queremos renderizar diferentes plantillas HTML/JSON/XML para teléfonos, tabletas y navegadores de escritorio. Las variantes lo hacen fácil.
La variante de la solicitud es una especialización del formato de la solicitud, como :tablet
, :phone
o :desktop
.
Puede establecer la variante en un before_action
:
request.variant = :tablet if request.user_agent =~ /iPad/
Responda a las variantes en la acción de la misma manera que responde a los formatos:
respond_to do |format|
format.html do |html|
html.tablet # renderiza app/views/projects/show.html+tablet.erb
html.phone { extra_setup; render ... }
end
end
Proporcione plantillas separadas para cada formato y variante:
app/views/projects/show.html.erb
app/views/projects/show.html+tablet.erb
app/views/projects/show.html+phone.erb
También puede simplificar la definición de variantes utilizando la sintaxis en línea:
respond_to do |format|
format.js { render "trash" }
format.html.phone { redirect_to progress_path }
format.html.none { render "trash" }
end
2.4 Previsualizaciones de Action Mailer
Las previsualizaciones de Action Mailer proporcionan una forma de ver cómo se ven los correos electrónicos visitando una URL especial que los renderiza.
Implemente una clase de previsualización cuyos métodos devuelvan el objeto de correo que desea verificar:
class NotifierPreview < ActionMailer::Preview
def welcome
Notifier.welcome(User.first)
end
end
La previsualización está disponible en http://localhost:3000/rails/mailers/notifier/welcome, y una lista de ellas en http://localhost:3000/rails/mailers.
De forma predeterminada, estas clases de previsualización se encuentran en test/mailers/previews
. Esto se puede configurar utilizando la opción preview_path
.
Consulte su documentación para obtener una descripción detallada.
2.5 Enumeraciones de Active Record
Declare un atributo de enumeración donde los valores se asignen a enteros en la base de datos, pero se puedan consultar por nombre.
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
conversation.archived!
conversation.active? # => false
conversation.status # => "archived"
Conversation.archived # => Relación de todas las Conversaciones archivadas
Conversation.statuses # => { "active" => 0, "archived" => 1 }
Consulte su documentación para obtener una descripción detallada.
2.6 Verificadores de mensajes
Los verificadores de mensajes se pueden utilizar para generar y verificar mensajes firmados. Esto puede ser útil para transportar de forma segura datos sensibles como tokens de recordatorio y amigos.
El método Rails.application.message_verifier
devuelve un nuevo verificador de mensajes que firma mensajes con una clave derivada de secret_key_base
y el nombre del verificador de mensajes dado:
```ruby
signed_token = Rails.application.message_verifier(:remember_me).generate(token)
Rails.application.message_verifier(:remember_me).verify(signed_token) # => token
Rails.application.message_verifier(:remember_me).verify(tampered_token)
raises ActiveSupport::MessageVerifier::InvalidSignature
### Module#concerning
Una forma natural y sencilla de separar responsabilidades dentro de una clase:
```ruby
class Todo < ActiveRecord::Base
concerning :EventTracking do
included do
has_many :events
end
def latest_event
# ...
end
private
def some_internal_method
# ...
end
end
end
Este ejemplo es equivalente a definir un módulo EventTracking
en línea,
extenderlo con ActiveSupport::Concern
y luego mezclarlo en la clase Todo
.
Consulte su documentación para obtener una descripción detallada y los casos de uso previstos.
2.7 Protección CSRF desde etiquetas <script>
remotas
La protección contra falsificación de solicitudes entre sitios (CSRF) ahora cubre las solicitudes GET con respuestas JavaScript. Esto evita que un sitio de terceros haga referencia a su URL de JavaScript e intente ejecutarla para extraer datos sensibles.
Esto significa que cualquier prueba que acceda a URLs .js
ahora fallará la protección CSRF a menos que use xhr
. Actualice sus pruebas para que sean explícitas al esperar XmlHttpRequests. En lugar de post :create, format: :js
, cambie a xhr :post, :create, format: :js
.
3 Railties
Consulte el registro de cambios para obtener cambios detallados.
3.1 Eliminaciones
Se eliminó la tarea rake
update:application_controller
.Se eliminó
Rails.application.railties.engines
, que estaba en desuso.Se eliminó
threadsafe!
de Rails Config, que estaba en desuso.Se eliminó
ActiveRecord::Generators::ActiveModel#update_attributes
, que estaba en desuso, en favor deActiveRecord::Generators::ActiveModel#update
.Se eliminó la opción
config.whiny_nils
, que estaba en desuso.Se eliminaron las tareas rake en desuso para ejecutar pruebas:
rake test:uncommitted
yrake test:recent
.
3.2 Cambios destacados
El pre-cargador de aplicaciones Spring ahora se instala de forma predeterminada en las nuevas aplicaciones. Utiliza el grupo de desarrollo del
Gemfile
, por lo que no se instalará en producción. (Pull Request)BACKTRACE
es una variable de entorno que muestra trazas sin filtrar para fallas en las pruebas. (Commit)Se expuso
MiddlewareStack#unshift
para la configuración del entorno. (Pull Request)Se agregó el método
Application#message_verifier
para devolver un verificador de mensajes. (Pull Request)El archivo
test_help.rb
, que es requerido por el ayudante de prueba generado por defecto, mantendrá automáticamente su base de datos de prueba actualizada condb/schema.rb
(odb/structure.sql
). Generará un error si volver a cargar el esquema no resuelve todas las migraciones pendientes. Desactive esto conconfig.active_record.maintain_test_schema = false
. (Pull Request)Se introdujo
Rails.gem_version
como un método de conveniencia para devolverGem::Version.new(Rails.version)
, sugiriendo una forma más confiable de realizar comparaciones de versiones. (Pull Request)
4 Action Pack
Consulte el registro de cambios para obtener cambios detallados.
4.1 Eliminaciones
Se eliminó la funcionalidad obsoleta de fallback de la aplicación Rails para las pruebas de integración, en su lugar, configure
ActionDispatch.test_app
.Se eliminó la configuración obsoleta
page_cache_extension
.Se eliminaron las constantes obsoletas de Action Controller:
Eliminado | Sucesor |
---|---|
ActionController::AbstractRequest | ActionDispatch::Request |
ActionController::Request | ActionDispatch::Request |
ActionController::AbstractResponse | ActionDispatch::Response |
ActionController::Response | ActionDispatch::Response |
ActionController::Routing | ActionDispatch::Routing |
ActionController::Integration | ActionDispatch::Integration |
ActionController::IntegrationTest | ActionDispatch::IntegrationTest |
4.2 Cambios destacados
protect_from_forgery
también evita las etiquetas<script>
de origen cruzado. Actualice sus pruebas para usarxhr :get, :foo, format: :js
en lugar deget :foo, format: :js
. (Pull Request)#url_for
ahora toma un hash con opciones dentro de un array. (Pull Request)Se agregó el método
session#fetch
, que se comporta de manera similar a Hash#fetch, con la excepción de que el valor devuelto siempre se guarda en la sesión. (Pull Request)Se separó completamente Action View de Action Pack. (Pull Request)
Se registra qué claves se ven afectadas por la manipulación profunda. (Pull Request)
Nueva opción de configuración
config.action_dispatch.perform_deep_munge
para optar por no realizar la "manipulación profunda" de los parámetros que se utilizó para abordar la vulnerabilidad de seguridad CVE-2013-0155. (Pull Request)Nueva opción de configuración
config.action_dispatch.cookies_serializer
para especificar un serializador para los tarros de cookies firmados y encriptados. (Pull Requests 1, 2 / Más detalles)Se agregaron
render :plain
,render :html
yrender :body
. (Pull Request / Más detalles)
5 Action Mailer
Consulte el registro de cambios para obtener cambios detallados.
5.1 Cambios destacados
Se agregó la función de vistas previas de correo basada en la gema mail_view de 37 Signals. (Commit)
Se instrumenta la generación de mensajes de Action Mailer. El tiempo que lleva generar un mensaje se registra en el registro. (Pull Request)
6 Active Record
Consulte el registro de cambios para obtener cambios detallados.
6.1 Eliminaciones
Se eliminó la funcionalidad obsoleta de pasar
nil
a los siguientes métodos deSchemaCache
:primary_keys
,tables
,columns
ycolumns_hash
.Se eliminó el filtro de bloque obsoleto de
ActiveRecord::Migrator#migrate
.Se eliminó el constructor de cadena obsoleto de
ActiveRecord::Migrator
.Se eliminó el uso obsoleto de
scope
sin pasar un objeto invocable.Se eliminó
transaction_joinable=
en favor debegin_transaction
con la opción:joinable
.Se eliminó
decrement_open_transactions
, que estaba en desuso.Se eliminó
increment_open_transactions
, que estaba en desuso.Se eliminó el método
PostgreSQLAdapter#outside_transaction?
obsoleto. Ahora puedes usar#transaction_open?
en su lugar.Se eliminó el método obsoleto
ActiveRecord::Fixtures.find_table_name
a favor deActiveRecord::Fixtures.default_fixture_model_name
.Se eliminó el método
columns_for_remove
obsoleto deSchemaStatements
.Se eliminó el método obsoleto
SchemaStatements#distinct
.Se movió la clase
ActiveRecord::TestCase
obsoleta al conjunto de pruebas de Rails. La clase ya no es pública y solo se utiliza para pruebas internas de Rails.Se eliminó el soporte para la opción obsoleta
:restrict
para:dependent
en las asociaciones.Se eliminó el soporte para las opciones obsoletas
:delete_sql
,:insert_sql
,:finder_sql
y:counter_sql
en las asociaciones.Se eliminó el método obsoleto
type_cast_code
de Column.Se eliminó el método obsoleto
ActiveRecord::Base#connection
. Asegúrate de acceder a él a través de la clase.Se eliminó la advertencia de deprecación para
auto_explain_threshold_in_seconds
.Se eliminó la opción obsoleta
:distinct
deRelation#count
.Se eliminaron los métodos obsoletos
partial_updates
,partial_updates?
ypartial_updates=
.Se eliminó el método obsoleto
scoped
.Se eliminó el método obsoleto
default_scopes?
.Se eliminaron las referencias de unión implícitas que se volvieron obsoletas en la versión 4.0.
Se eliminó
activerecord-deprecated_finders
como dependencia. Consulta el archivo README de la gema para obtener más información.Se eliminó el uso de
implicit_readonly
. Ahora debes usar el métodoreadonly
explícitamente para marcar los registros como "solo lectura". (Pull Request)
6.2 Deprecaciones
Se deprecó el método
quoted_locking_column
, que no se utiliza en ningún lugar.Se deprecó
ConnectionAdapters::SchemaStatements#distinct
, ya que ya no se utiliza internamente. (Pull Request)Se deprecó las tareas
rake db:test:*
, ya que la base de datos de pruebas ahora se mantiene automáticamente. Consulta las notas de la versión de Railties. (Pull Request)Se deprecia
ActiveRecord::Base.symbolized_base_class
yActiveRecord::Base.symbolized_sti_name
, que no se utilizan y no tienen reemplazo. Commit
6.3 Cambios destacados
- Las scopes predeterminadas ya no se anulan por condiciones encadenadas.
Antes de este cambio, cuando definías una default_scope
en un modelo, se anulaba por condiciones encadenadas en el mismo campo. Ahora se fusiona como cualquier otra scope. Más detalles.
Se agregó
ActiveRecord::Base.to_param
para obtener URL "bonitas" derivadas de un atributo o método del modelo. (Pull Request)Se agregó
ActiveRecord::Base.no_touching
, que permite ignorar el "touch" en los modelos. (Pull Request)Se unificó la conversión de tipo booleano para
MysqlAdapter
yMysql2Adapter
.type_cast
devolverá1
paratrue
y0
parafalse
. (Pull Request).unscope
ahora elimina las condiciones especificadas endefault_scope
. (Commit)Se agregó
ActiveRecord::QueryMethods#rewhere
, que sobrescribe una condiciónwhere
existente con nombre. (Commit)Se amplió
ActiveRecord::Base#cache_key
para aceptar una lista opcional de atributos de marca de tiempo, de los cuales se utilizará el más alto. (Commit)Se agregó
ActiveRecord::Base#enum
para declarar atributos de enumeración donde los valores se mapean a enteros en la base de datos, pero se pueden consultar por nombre. (Commit)Se convierten los valores JSON al escribirlos, para que el valor sea coherente con la lectura desde la base de datos. (Pull Request)
Se convierten los valores hstore al escribirlos, para que el valor sea coherente con la lectura desde la base de datos. (Commit)
Se hace accesible
next_migration_number
para generadores de terceros. (Pull Request)Llamar a
update_attributes
ahora lanzará unArgumentError
si recibe un argumentonil
. Específicamente, lanzará un error si el argumento que se le pasa no responde astringify_keys
. (Pull Request)CollectionAssociation#first
/#last
(por ejemplo,has_many
) utiliza una consulta conLIMIT
para obtener resultados en lugar de cargar toda la colección. (Pull Request)inspect
en las clases de modelo de Active Record ya no inicia una nueva conexión. Esto significa que llamar ainspect
, cuando falta la base de datos, ya no generará una excepción. (Pull Request)Se eliminaron las restricciones de columna para
count
, dejando que la base de datos genere un error si el SQL es inválido. (Pull Request)Rails ahora detecta automáticamente las asociaciones inversas. Si no estableces la opción
:inverse_of
en la asociación, Active Record adivinará la asociación inversa en función de heurísticas. (Pull Request)Se manejan los atributos con alias en ActiveRecord::Relation. Al usar claves de símbolos, ActiveRecord ahora traducirá los nombres de atributos con alias al nombre de columna real utilizado en la base de datos. (Pull Request)
El ERB en los archivos de fixtures ya no se evalúa en el contexto del objeto principal. Los métodos auxiliares utilizados por varias fixtures deben definirse en módulos incluidos en
ActiveRecord::FixtureSet.context_class
. (Pull Request)No se crea ni se elimina la base de datos de pruebas si se especifica explícitamente RAILS_ENV. (Pull Request)
Relation
ya no tiene métodos mutadores como#map!
y#delete_if
. Conviértelo en unArray
llamando a#to_a
antes de usar estos métodos. (Pull Request)find_in_batches
,find_each
,Result#each
yEnumerable#index_by
ahora devuelven unEnumerator
que puede calcular su tamaño. (Pull Request)scope
,enum
y las asociaciones ahora generan un error en caso de conflictos de nombres "peligrosos". (Pull Request, Pull Request)Los métodos
second
afifth
actúan como el buscadorfirst
. (Pull Request)touch
ahora activa los callbacksafter_commit
yafter_rollback
. (Pull Request)Habilitar índices parciales para
sqlite >= 3.8.0
. (Pull Request)Hacer que
change_column_null
sea reversible. (Commit)Se agregó una bandera para deshabilitar la generación del esquema después de la migración. Esto está configurado en
false
de forma predeterminada en el entorno de producción para nuevas aplicaciones. (Pull Request)
7 Active Model
Consulte el Registro de cambios para obtener cambios detallados.
7.1 Deprecaciones
- Se deprecó
Validator#setup
. Ahora esto debe hacerse manualmente en el constructor del validador. (Commit)
7.2 Cambios destacados
Se agregaron nuevos métodos de API
reset_changes
ychanges_applied
aActiveModel::Dirty
que controlan el estado de los cambios.Posibilidad de especificar múltiples contextos al definir una validación. (Pull Request)
attribute_changed?
ahora acepta un hash para verificar si el atributo cambió:from
y/o:to
un valor dado. (Pull Request)
8 Active Support
Consulte el Registro de cambios para obtener cambios detallados.
8.1 Eliminaciones
Se eliminó la dependencia de
MultiJSON
. Como resultado,ActiveSupport::JSON.decode
ya no acepta un hash de opciones paraMultiJSON
. (Pull Request / Más detalles)Se eliminó el soporte para el gancho
encode_json
utilizado para codificar objetos personalizados en JSON. Esta función se ha extraído al activesupport-json_encoder gem. (Pull Request relacionado / Más detalles)Se eliminó
ActiveSupport::JSON::Variable
deprecado sin reemplazo.Se eliminaron las extensiones de núcleo
String#encoding_aware?
(core_ext/string/encoding
) deprecadas.Se eliminó
DateTime.local_offset
deprecado en favor deDateTime.civil_from_format
.Se eliminaron las extensiones de núcleo
Logger
deprecadas (core_ext/logger.rb
).Se eliminaron
Time#time_with_datetime_fallback
,Time#utc_time
yTime#local_time
deprecados en favor deTime#utc
yTime#local
.Se eliminó
Hash#diff
deprecado sin reemplazo.Se eliminó
Date#to_time_in_current_zone
deprecado en favor deDate#in_time_zone
.Se eliminó
Proc#bind
deprecado sin reemplazo.Se eliminaron
Array#uniq_by
yArray#uniq_by!
deprecados, useArray#uniq
yArray#uniq!
nativos en su lugar.Se eliminó
ActiveSupport::BasicObject
deprecado, useActiveSupport::ProxyObject
en su lugar.Se eliminó
BufferedLogger
deprecado, useActiveSupport::Logger
en su lugar.Se eliminaron los métodos
assert_present
yassert_blank
, useassert object.blank?
yassert object.present?
en su lugar.Se eliminó el método
#filter
deprecado para objetos de filtro, use el método correspondiente en su lugar (por ejemplo,#before
para un filtro antes).Se eliminó la irregular inflexión 'cow' => 'kine' de las inflexiones predeterminadas. (Commit)
8.2 Deprecaciones
Se deprecó
Numeric#{ago,until,since,from_now}
, se espera que el usuario convierta explícitamente el valor en un AS::Duration, es decir,5.ago
=>5.seconds.ago
(Pull Request)Se deprecó la ruta de requerimiento
active_support/core_ext/object/to_json
. En su lugar, requieraactive_support/core_ext/object/json
. (Pull Request)Se deprecó
ActiveSupport::JSON::Encoding::CircularReferenceError
. Esta función se ha extraído al activesupport-json_encoder gem. (Pull Request / Más detalles)Se deprecó la opción
ActiveSupport.encode_big_decimal_as_string
. Esta función se ha extraído al activesupport-json_encoder gem. (Pull Request / Más detalles)Se deprecó la serialización personalizada de
BigDecimal
. (Pull Request)
8.3 Cambios destacados
El codificador JSON de
ActiveSupport
se ha reescrito para aprovechar la gema JSON en lugar de realizar una codificación personalizada en Ruby puro. (Pull Request / Más detalles)Mejorada la compatibilidad con la gema JSON. (Pull Request / Más detalles)
Se agregaron los métodos
ActiveSupport::Testing::TimeHelpers#travel
y#travel_to
. Estos métodos cambian la hora actual a la hora o duración especificada mediante la simulación deTime.now
yDate.today
.Se agregó
ActiveSupport::Testing::TimeHelpers#travel_back
. Este método devuelve la hora actual a su estado original, eliminando las simulaciones agregadas portravel
ytravel_to
. (Pull Request)Se agregó
Numeric#in_milliseconds
, como1.hour.in_milliseconds
, para poder usarlo en funciones de JavaScript comogetTime()
. (Commit)Se agregaron los métodos
Date#middle_of_day
,DateTime#middle_of_day
yTime#middle_of_day
. También se agregaronmidday
,noon
,at_midday
,at_noon
yat_middle_of_day
como alias. (Pull Request)Se agregaron
Date#all_week/month/quarter/year
para generar rangos de fechas. (Pull Request)Se agregaron
Time.zone.yesterday
yTime.zone.tomorrow
. (Pull Request)Se agregó
String#remove(pattern)
como una forma abreviada del patrón común deString#gsub(pattern,'')
. (Commit)Se agregaron
Hash#compact
yHash#compact!
para eliminar elementos con valor nulo de un hash. ([Pull Request](https://github.com/r
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.