Lo más importante esta semana en el desarrollo de Rails es el inminente lanzamiento de Rails 2.2.1 -también conocido como Rails 2.2 RC2. Debido a eso ha habido algunos cambios significativos en el repositorio de Rails.
En primer lugar, es probable que sea necesario actualizar rubygems para ejecutar RC2: ahora requiere la versión 1.3.1 de rubygems, que fue publicada exactamente ayer. Esto hará más util y estable la posibilidad de poner gemas en el directorio vendor, aunque a costa de una actualización que puede resultar algo costosa. En este artículo se pueden encontrar algunas soluciones. commit
También se ha trabajado bastante en el motor de rutas durante la semana pasada. Jeremy Kemper entregó bastantes correcciones que minimizan la creación de objetos y expresiones regulares, recortando así el uso de memoria. commit commit Ahora tenemos las las opciones :only y :except para invocar a map.resources, que también harán descender el uso de memoria si usamos muchas rutas de recursos -véanse estos artículos para entrar en detalle (aunque también ha habido algunos retoques a la manera en que funcionan los recursos anidados después de que se publicase). commit commit commit
El nuevo código de pooling de conexiones de ActiveRecord ha sido afinado un poco también, evitando algunos problemillas con el adaptador de Oracle y siendo un poco más eficiente en modo desarrollo. commit
Las URLs polimórficas son ahora más intuitivas si uno de sus parámetros es nil. Por ejemplo, llamar a polymorphic_path([@project, @filter, @issue]) con un filtro nulo ahora devuelve project_issue_url en lugar de NoMethodError. commit
Se ha limitado la funcionalidad de protección contra request forgery de forma que sólo se aplica a peticiones que solicitan contenido formateado en HTML. Ha habido una gran discusión en el ticket de Lighthouse que llevó a este cambio, pero se resume en que la implementación anterior tenía fallos que hacían que las acciones destroy fueran inaccesibles cuando se usaba XML. Además, los otros tipos de peticionese pueden proteger por otros medios. commit
(Este artículo es una traducción de Living on the edge of Rails (22), publicado por Chu Yeow en su blog redemption in a blog)
No ha habido cambios alucinantes en esta semana previa a la RailsConf -tal y como mencionó Gregg en el podcast de RailsEnvy estamos en la antesala de Rails 2.1 (probablemente será lanzado durante la misma RailsConf), así que es comprensible esta tranquilidad. Ah, y ahora todos los tests pasan con Ruby 1.9 después de que un recalcitrante error en module_eval haya sido corregido en el trunk de Ruby 1.9. (Véase este hilo para más información)
El informe de esta semana cubre los cambios efectuados en Rails entre el 19 y el 25 de Mayo de 2008.
Métodos first y last en asociaciones y ámbitos con nombre
¿Recordais cómo la integración de la gema has_finder nos permitía hacer cosas como Post.first y Post.last?
Ahora podemos ir un paso más allá y utilizar los mismo métodos en las asociaciones ActiveRecord. Por ejemplo:
post = Post.find(1)
first_comment = post.comments.first
Y si hemos definido un named scope llamado recent, podemos incluso hacer:
post.comments.recent.last
Esta pequeña mejora es cortesía de Ryan Bates (sí, el Ryan Bates de RailsCasts)
Métodos exist? y fragment_exist? para la caché
Los almacenes de caché en Rails (memcache, fichero, etc) ahora disponen de un método exist? que comprueba si la caché dispone de un valor guardado para una clave dada. Esto permite que los controladores Rails dispongan de un método fragment_exist? que nos permite preguntar si existe un fragmento de caché.
fragment_exist?('example.com/foo/bar')
El cambio correspondiente es http://github.com/rails/rails/commit/99860b72aebe0348f41e82d4710343498d89a84b#diff-2
Creación de registros en asociaciones con bloques como argumento
Ahora se pueden crear registros para asociaciones así
post.comments.create!(:title => 'Techcrunch') do |c|
c.body = "Rails no escala!"
end
Todo esto va parejo con el reciente cambio en ActiveRecord::Base.create del que ya hemos hablado por aquí
El autor de este parche es (otra vez) Ryan Bates
El cambio es este
¡Hasta la semana que viene!

