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

Ruby on Rails 4.1 Notas de la versión

Aspectos destacados en Rails 4.1:

Estas notas de la versión 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 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 de ActiveRecord::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 y rake 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 con db/schema.rb (o db/structure.sql). Generará un error si volver a cargar el esquema no resuelve todas las migraciones pendientes. Desactive esto con config.active_record.maintain_test_schema = false. (Pull Request)

  • Se introdujo Rails.gem_version como un método de conveniencia para devolver Gem::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 usar xhr :get, :foo, format: :js en lugar de get :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 y render :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 de SchemaCache: primary_keys, tables, columns y columns_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 de begin_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 de ActiveRecord::Fixtures.default_fixture_model_name.

  • Se eliminó el método columns_for_remove obsoleto de SchemaStatements.

  • 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 de Relation#count.

  • Se eliminaron los métodos obsoletos partial_updates, partial_updates? y partial_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étodo readonly 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 y ActiveRecord::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 y Mysql2Adapter. type_cast devolverá 1 para true y 0 para false. (Pull Request)

  • .unscope ahora elimina las condiciones especificadas en default_scope. (Commit)

  • Se agregó ActiveRecord::QueryMethods#rewhere, que sobrescribe una condición where 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á un ArgumentError si recibe un argumento nil. Específicamente, lanzará un error si el argumento que se le pasa no responde a stringify_keys. (Pull Request)

  • CollectionAssociation#first/#last (por ejemplo, has_many) utiliza una consulta con LIMIT 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 a inspect, 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 un Array llamando a #to_a antes de usar estos métodos. (Pull Request)

  • find_in_batches, find_each, Result#each y Enumerable#index_by ahora devuelven un Enumerator 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 a fifth actúan como el buscador first. (Pull Request)

  • touch ahora activa los callbacks after_commit y after_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 y changes_applied a ActiveModel::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 para MultiJSON. (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 de DateTime.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 y Time#local_time deprecados en favor de Time#utc y Time#local.

  • Se eliminó Hash#diff deprecado sin reemplazo.

  • Se eliminó Date#to_time_in_current_zone deprecado en favor de Date#in_time_zone.

  • Se eliminó Proc#bind deprecado sin reemplazo.

  • Se eliminaron Array#uniq_by y Array#uniq_by! deprecados, use Array#uniq y Array#uniq! nativos en su lugar.

  • Se eliminó ActiveSupport::BasicObject deprecado, use ActiveSupport::ProxyObject en su lugar.

  • Se eliminó BufferedLogger deprecado, use ActiveSupport::Logger en su lugar.

  • Se eliminaron los métodos assert_present y assert_blank, use assert object.blank? y assert 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, requiera active_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 de Time.now y Date.today.

  • Se agregó ActiveSupport::Testing::TimeHelpers#travel_back. Este método devuelve la hora actual a su estado original, eliminando las simulaciones agregadas por travel y travel_to. (Pull Request)

  • Se agregó Numeric#in_milliseconds, como 1.hour.in_milliseconds, para poder usarlo en funciones de JavaScript como getTime(). (Commit)

  • Se agregaron los métodos Date#middle_of_day, DateTime#middle_of_day y Time#middle_of_day. También se agregaron midday, noon, at_midday, at_noon y at_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 y Time.zone.tomorrow. (Pull Request)

  • Se agregó String#remove(pattern) como una forma abreviada del patrón común de String#gsub(pattern,''). (Commit)

  • Se agregaron Hash#compact y Hash#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.