Novedades en Edge Rails #10

Nota: Esta entrada es una traducción de la publicada el 16 de Enero de 2009 por Mike Gunderloy en el blog de Ruby on Rails.

Ha habido 24 entregas en edge Rails durante esta semana (y un parche migrado a la rama 2.2 también). Si estamos interesados en lo que luego será Rails 2.3 este es un buen momento para instalar una copia de edge, si aún no lo estamos usando. Es bastante estable para montar sitios de prueba aunque aún quedan un par de asperezas.

Transacciones anidadas en Active Record

Varias personas han colaborado para escribir un gran parche que nos proporciona transacciones anidades en ActiveRecord, una funcionalidad bastante solicitada. Ahora podemos escribir código como:

User.transaction do
    User.create(:username => 'Admin')
    User.transaction(:requires_new => true) do
      User.create(:username => 'Regular')
      raise ActiveRecord::Rollback
    end
  end

  User.find(:all)  # => Returns only Admin

Con transacciones anidadas podemos deshacer una transacción interior sin afectar el estado de la transacción exterior. Para anidar transacciones debemos añadir explícitamente la opción :requires_new de lo contrario la transacción interior queda como parte de la transacción exterior (tal y como funciona ahora en Rails 2.2). Estas transacciones anidade utilizan, entre bambalinas, puntos de guarda, de forma que quedan soportadas incluso en bases de datos que no tienen auténticas transacciones anidadas. Entra bastante magia en juego para que estas transacciones funcionen bien durante los tests con las fixturas transaccionales. commit

Mejoras en MemCacheStore

Nahum Wild ha contribuido con un trabajo (inspirado por su plugin spandex_mem_cache_store) que mejora el rendimiento de Rails cuando se utiliza MemCacheStore. La idea básica es mantener para cada petición una caché local de las llamadas a MemCacheStore, ahorrando lecturas innecesarias. commit

Comportamiento de los callbacks de ActiveRecord

Tal vez recuerden el pasaje de la documentación de Active Record que dice “si una callback before_* devuelve false, se cancelan todas las posteriores callbacks y sus acciones asociadas.” Lo que tal vez no sepamos es que esto está en la actualidad roto en la versión actual de Rails:si cancelamos una callback before_update o before_create las callbacks after_save aún siguen ejecutándose. En Rails 2.3 se recuperará el comportamiento descrito por la documentación. commit

Fracciones de segundo en TimeWithZone

Las clases Time y TimeWithZone incluyen un método xmlschema para devolver la hora con una cadena XML. A partir de esta semana, TimeWithZone también soporta el mismo argumento para poder especificar el número de digits en la parte de fracciones de segundo de la cadena devuelta igual que Time.

>> Time.zone.now.xmlschema(6)
=> "2009-01-16T13:00:06.13653Z" 

commit

Entrecomillado de claves en JSON

Si miramos las especifciaciones en json.org, descubriremos que todas las claves en una estructura JSON deben ser cadenas y deben ser entrecomilladas con comillas dobles. A partir de esta semana Rails aplica esto a rajatabla incluso con claves numéricas. commit

Refactorización de tests

Josh Peek ha pasado un tiempo refactorizando varios tests dentro de Action Pack, incluyendo los de análisis de la cadena de la petición, paso de parámetros en JSON, paso de parámetros en XML, análisis de parámetros multiparte, y análisis codificados por URL. Aunque todo este trabajo no aporta ninguna nueva funcionalidad merece la pena destacar el trabajo -a veces poco agradecido- de limpieza que mantiene en buena forma el código de Rails.

Cambios en Object#try

Tras alguna discusión la semántica de Object#try ha cambiado ligeramente: ahora eleva la excepción NoMethodError en métodos privados y siempre devuelve nil si el objeto es nulo. commit

blog comments powered by Disqus