Antes que nada esta semana, una advertencia para aquellos que no sigan de cerca el estado del repositorio de Rails – “edge” ahora quiere decir el filo de la navaja. Ya se está preparando el lanzamiento de la release 2.2 y el repositorio se ha bifurcado; por el momento la versión edge de Rails se identifica como 2.3 , aunque el número de versión podría cambiar más adelante. Si queremos instalar la versión 2.2 en nuestra máquina, deberíamos asegurarnos de que estamos usando la rama 2-2-stable, y no edge, que está sufriendo cambios profundos.
El código en 2-2-stable aún sigue viendo cambios, pero son pequeños ajustes. Esta semana, se trata de corregir un bug en la asignación en asociaciones has_one :through , más ajustes a la protección CSRF , y una correción a la manipulación de checkboxes para valores booleanos, así como la actualización de las copias incluidas de TZInfo, Prototype, script.aculo.us. También se ha avanzado en la compatibilidad con Ruby 1.9 (aunque el objetivo de soportar Ruby 1.9 en sus totatlidad está planteado para Rails 2.3).
Las mayores modificaciones en la rama 2.2 es la adición de soporte explícito de internacionalización en los proyectos Rails recién generados, incluyendo un archivo de locale de ejemplo, la autocarga de todos los locales que existan en config/locales y configuración de ejemplo en config/environment.rb. commit
Tabién es destacable que en 2.2 se ha eliminado un buen trozo de código, desapareciendo de los casos de tests de ActiveRecorod todo un embrollo de casos especiales para el adaptador de SQL Server. Ken Collins ha hecho un tremendo trabajo consiguiendo que el adaptador de SQL Server funcione de la manera que Rails espera que lo hagan los adaptadores, lo cual es un gran pasado en el área de la portabilidad de los adaptadores. commit
En cuanto a la rama edge, hay todavía más acción. Con esta rama recién abierta, acaba de entrar un montón de código que estaba esperando su momento. Corren tiempos interesantes, y merece mucho la pena descargarse edge. Pasemos a ver algunos de los cambios más notables de la última semana.
Muchos cambios son obras de Jeremy Kemper, que ha estado mejorando los tests internos de Rails para cambiar de Test::Unit::TestCase a ActiveSupport::TestCase. Esto incluye también el requisito de usar Mocha para testar Rails (en el código 2.2, si no tenemos Mocha instalados, algunos tests serán ignorados), así como hacer que la estrategia de testing en Rails (tanto en el core como en las aplicaciones generadas) sea más consistente de ahora en adelante.
Aquellos a los que molestaba el caso espacial del nombre de archivo application.rb se alegrarán de saber que se ha cambiado a application_controller.rb. Hay más información aquí y aquí . commit
Con Rails 2.3 se introducirá la noción del default scopes : similares a los named scopes, pero que se aplican a todos los scopes o métodos find dentro de la clase. Por ejemplo, podemos escribir default_scope :order => 'name ASC' y en culauqie rmomento en que se accedan a registro de esa clase, serán recuperados ordenados por nombre (a no ser, claro está, que se indique otra opción) commit
Muchos programadores han adoptado la noción de usar try() a la hora de lanzar operaciones en objetos – he aquí el post en el blog de Chris Wanstrath que lo presenta. Esto es especialmente útil en vistas donde uno puede evitar los chequeos de nil escribiendo código como<%= @person.try(:name) %>. Pues bien, ahora está incluido dentro de Rails. commit
También en el terreno del azúcar sintáctico aparece Enumerable#none? para comprobar que ningno de los elementos cumplen con el bloque proporcionado. commit
El método render se ha ido haciendo más listo conforme pasan los años, y lo será aún más en la 2.3. Si tenemos un objeto o una colección y los nombres conciden, ahora podemos hacer tan sólo <% render @article %> o <% render @articles %> y todo funcionará. Ryan Daigle ha escrito algunos ejemples de esto. commit
En el mismo orden de cosas, en 2.3 render_component ha pasado de “a extinguir” a “inexistente”. Si es necesario, aún podemos instalar el plugin . commit
El helper autolink se ha refactorizado para hacerlo un poco menos complicado y más intuitivo. commit commit
Ha habido un arreglo para una fuga de memoria relacionada con el soporte de multithreading y los tags de assets, que podría perjudicar a sites que estuvieran referenciando muchas imágenes externas. Aaron Batalion ha contribuido la solución a este problema, así como un blog explicando el problema. commit and commit
Por último, merece la pena mencionar que ha surgido algo de controversia alrededor de un cambio hecho al código 2.2 hace cinco meses – la adición de Array#second a Array#tenth como aliases de Array#[1] a Array#[9]. Sin tomar partido en la controversia, notaremos que el cambio más reciente en edge ha reducido el soporte sólo de Array#second a Array#fifth – y con el ahorro ahora se ha podido implementar Array#forty-two. commit
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!

