Aclaración: la columna semanal que publicaba Chu Yeow e su blog ha pasado al blog oficial de Ruby on Rails. Con este cambio la numeración de las entregas vuelve a empezar por el número 1.

Ha habido un buen puñado de cambios y mejoras de rendimiento en las últimas semanas desde la aparición de Rails 2.1, así que en lugar de volcarlas todas en un post enorme, serán repartidas en dos. En esta entrega hablaremos de las nuevas featuras y cambios en la API.

Cambios menores en la API

link_to ahora recibe un bloque

El helper link_to ahora recibe un bloque como argumento para aquellas ocasiones en las que tenemos textos muy largos con variable para nuestros enlaces


    <% link_to(@profile) do %>
      <strong><%= @profile.name %></strong> -
      <span>Status: <%= @profile.status %></span>
    <% end %>    

Es bastante más claro que


<%= link_to "<strong>#{@profile.name}</strong> " + 
"<span>Status: #{@profile.status}</span>", @profile %>

Los autores de este cambio son David Heinemeier y Sam Stephenson (de Prototype).

ActiveRecord::Base#merge_conditions es ahora parte de la API pública

Jeremy Kemper ha hecho público el método ActiveRecord::Base#merge_conditions.

Esto es bastante útil si en nuestras consultas a la base de datos tenemos condiciones de múltiples fuentes o querríamos, por alguna razón, combinar cualquier condición:


Post.merge_conditions(
      {:title => 'Lucky ☆ Star'},
      ['rating IN (?)', 1..5]
    )
=> "(`posts`.`title` = 'Lucky ☆ Star') AND (rating IN (1,2,3,4,5))" 

Debemos tener en cuenta que las uniones se hacen siempre con un AND lógico de SQL, nunca con un OR.

Detalles de este parche

Las asociaciones reciben una opción :validate

Las macros de las asociaciones ahora aceptan la opción :validate así:


class Anime > ActiveRecord::Base
  has_many :characters, :validate => true
end

Con esto le indicamos a ActiveRecord que valide las asociacion characters cuando almacene el modelo Anime, exactamente de la manera en que funciona :validates_associated. Por defecto el valor es falso, que es el funcionamiento por defecto de Rails 2.1 y anteriores, así que no es necesario perder la tranquilidad. Este mecanismo funciona también con el resto de macros (has_one, belongs_to, has_and_belongs_to_many)

Demos las gracias a Jan de Poorter y Pratik Naik por este cambio, que también resuelve un bug recalcitrante. Parche.

ActiveSupport::StringInquirer y los métodos de conveniencia Rails.env.development?

DHH ha añadido recientemente una subclase ActiveSupport::StringInquirer que permite hacer lo siguiente:


s = ActiveSupport::StringInquirer.new('awesome')
=> "awesome" 
s.awesome?
=> true
s.sucks?
=> false

Un uso inmediato de esto es cuando estamos comprobando el entorno en que se está ejecutando nuestra aplicación: Rails.env está recubierto por un StringInquirer, de forma que se pueden usar métodos de consuta como Rails.env.development? y Rails.env.production?

Detalles

Extensiones al core: Object#present? y Enumerable#many?

DHH también ha añadido algunas extensiones que, si bien son triviales, pueden contribuir a hacer nuestro código más legible. El primero es Object#present?, que equivale a !Object#blank?


[].present?
=> false
[1, 2].present?
=> true
"".present?
=> false
"heme aquí".present?
=> true

También se ha añadido una extensión Enumerable#many? que es simplemente un valor lógico que comprueba si enumerable.size > 1:


[].many?
=> false
[:solo_yo].many?
=> false
[:solo_yo, 'mi_amigo'].many?
=> true

Parche para Object#present? y parche para Enumerable#many?

Sintaxis declarativa de bloques para escribir tests

DHH debía de estar inspirándose en Jay Fields cuando escribió este terrón de azúcar sintáctico: ahora podemos escribir nuestros tests (Test::Unit) con forma de bloques declarativos:


test "Un anime debería ser no válido si cualquiera de sus personajes no es valido" do
  # Codigo normal de pruebas
end

Todos los stubs de tests generados por Rails utilizan ya esta nueva sintaxis.

Detalles del parche

Pruebas de rendimiento

Jeremy Kemper ha estado haciendo un gran trabajo en la optimización y mejora del rendimiento de Rails, así que no es de extrañar que haya introducido un nuevo tiempo de tests de integración: el test de rendimiento.

Ahora podemos usar el generador de tests de rendimiento (añadido por Pratik en el cambio 23232a) para generar un test de rendimiento que rellenar.


script/generate performance_test LoginStories

Para correr los tests de rendimiento es necesario tener instalado ruby-prof (>= 0.6.1), que aún no ha sido publicado pero se puede obtener la versión de desarrollo haciendo un checkout del código ei nstalando la gem uno mismo. (Es mejor utilizar el fork de Jeremy por el momento) Es interesante hacer notar que con la versión 0.6.1 ruby-prof soporta casos de pruebas escrtos usando Test::Unit.

A continuación basta con poner código de pruebas (pedir unas cuantas acciones de algún controlador – cualquier historia de usuario de la que queramos probar el rendimiento) y ejecutar el test. Obtendremos un resutlado como este (además de toda la salida habitual de ruby-prof en test/tmp/performance ):

> ruby performance/login_stories_test.rb 
Loaded suite performance/login_stories_test
Started
LoginStoriesTest#test_homepage (32 ms warmup)
        process_time: 11 ms
              memory: unsupported
             objects: unsupported
.
Finished in 0.870842 seconds.

Los resultados de memory y objects están no soportados porque aún no he parcheado mi intérprete de Ruby con el soporte para profiling de la memoria y el recolector de basura. Hay información de cómo hacerlo aquí. Dejaremos que lo explique gente más sabia.

Detalles del parche

Sorry, comments are closed for this article.