<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Sobre Raíles</title>
 
 <link href="http://www.sobrerailes.com/" />
 <updated>2009-07-23T00:23:02+02:00</updated>
 <id>http://www.sobrerailes.com/</id>
 <author>
   <name>Juan Lupión</name>
 </author>
 
 
 <link rel="self" href="http://feeds.feedburner.com/SobreRailes" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
   <title>Solución de problemas extraños con rake gems:install</title>
   <link href="http://www.sobrerailes.com/2009/07/23/problemas_con_rake_gems_install" />
   <updated>2009-07-23T00:00:00+02:00</updated>
   <id>http://www.sobrerailes.com/2009/07/23/problemas_con_rake_gems_install</id>
   <content type="html">
		&lt;p&gt;Aprovechando mis &lt;em&gt;vacaciones&lt;/em&gt; me encuentro con el siguiente problema.  Tengo un proyecto al que afanosamente estoy añadiendo las dependencias de las gemas que utiliza en ''config/environment.rb'', pero me topo con que para instalar una gema usando ''rake gems:install''... ¡la tarea de Rake aborta diciendo que no puede instalar la gema que precisamente pretendo que instale!&lt;/p&gt;

&lt;p&gt;Algo así en ''config/environment.rb''&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem.install 'wadus-gem', :lib =&amp;gt; 'wadus_gem', :version =&amp;gt; '1.0.0'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;produce:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Missing these required gems:
  wadus-gem

You're running:
  ruby 1.8.6.110 at /opt/local/bin/ruby
  rubygems 1.3.5 at /Users/juan/.gem/ruby/1.8, /opt/local/lib/ruby/gems/1.8
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tras algo de investigación resulta que tenía una tarea de Rake que requería explícitamente ''config/environment.rb'' &lt;em&gt;antes&lt;/em&gt; de que la tarea ''gems:install'' pudiese instalar ninguna gema, lo que provocaba el error (se trata de un proyecto que ha sido migrado a Rails 2.3.2, de forma que no es precisamente nuevo).&lt;/p&gt;

&lt;p&gt;Simplemente bastó eliminar dicha linea&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require File.join(File.dirname(__FILE__) + "/../../config", 'environment')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;y la tarea ''rake gems:install'' vuelve a funcionar correctamente.&lt;/p&gt;

   </content>
 </entry>
 
 <entry>
   <title>Arreglando MSIE con un middleware de Rails</title>
   <link href="http://www.sobrerailes.com/2009/06/30/arreglando-msie-con-rails-metal" />
   <updated>2009-06-30T00:00:00+02:00</updated>
   <id>http://www.sobrerailes.com/2009/06/30/arreglando-msie-con-rails-metal</id>
   <content type="html">
		&lt;p&gt;En otro de los alardes de &lt;em&gt;simpatía&lt;/em&gt; de Internet Explorer, el otro día nos topamos con &lt;a href="http://geminstallthat.wordpress.com/2008/05/14/ie6-accept-header-is-faulty/"&gt;este conocido problema Explorer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El comportamiento de Explorer a la hora de establecer la cabecera &lt;code&gt;HTTP_ACCEPT&lt;/code&gt;: la primera vez que carga una URL pondrá la muy extraña cabecera&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, 
application/x-shockwave-flash, application/vnd.ms-excel,
application/vnd.ms-powerpoint, application/msword, */*
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;mientras que las posteriores peticiones llevaran un escueto &lt;code&gt;*/*&lt;/code&gt;.  Por qué tiene MSIE 6 la costumbre de solicitar tantos tipos de contenido MIME pero no un básico &lt;code&gt;text/html&lt;/code&gt; se me escapa (y más aún por qué en posteriores peticiones cambia la cabecera)  pero seguro que hay una razón perfectamente justificada para ello.&lt;/p&gt;

&lt;p&gt;En todo caso esta curiosa manía de MSIE puede hacer que se rompan cosas en Rails.  En concreto, una aplicación con un controlador de esta guisa devolverá el contenido incorrecto a MSIE:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def index
  respond_to do |format|
   format.xml { ... }
   format.html { ... }
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;dado que Rails no recibe explícitamente la petición de devolver HTML, asumirá que la petición se satisface correctamente devolviendo XML y por tanto Internet Explorer recibirá nuestra vista XML cuando el usuario simplemente quería cargar una URL.&lt;/p&gt;

&lt;p&gt;Por supuesto, la solución trivial es reescribir el código&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def index
  respond_to do |format|
   format.html { ... }
   format.xml { ... }
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;pero esto no siempre es tan fácil: en nuestro caso, estábamos usando &lt;a href="http://github.com/josevalim/inherited_resources/tree/master"&gt;el excelente plugin inherited_resources de José Valim&lt;/a&gt;, y la búsqueda no era trivial (aunque desde luego al final se encontró y resolvió de esta manera)&lt;/p&gt;

&lt;p&gt;Pero me quedé con la duda de si no sería posible &lt;em&gt;blindarse&lt;/em&gt; contra este tipo de escenarios...&lt;/p&gt;

&lt;h3&gt;Los &lt;em&gt;middlewares&lt;/em&gt; al rescate&lt;/h3&gt;

&lt;p&gt;Como &lt;a href="http://sobrerailes.com/2009/06/18/logger-en-rack-middleware"&gt;contaba el otro día&lt;/a&gt; los &lt;em&gt;middlewares&lt;/em&gt; nos permiten manipular el entorno de una petición HTTP y su respuesta justo antes de inyectársela a Rails.  Así que parecen un candidato ideal para lo que queríamos hacer, a saber: dada una petición HTTP, detectar si el navegador que la envía es MSIE y, si en la cabecera &lt;code&gt;HTTP_ACCEPT&lt;/code&gt; aparece el contenido MIME &lt;code&gt;*/*&lt;/code&gt; la manipularemos para insertar justo antes &lt;code&gt;text/html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Veamos cómo.  En primer lugar, crearemos nuestro &lt;em&gt;middleware&lt;/em&gt; en, por ejemplo, &lt;code&gt;lib/fix_msie_accept_header.rb&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class FixMSIEAcceptHeader
  def initialize(app, logger = nil)
    @app = app
  end

  def call(env)
    if is_msie?(env) &amp;amp;&amp;amp; !has_format?(env)
        env['HTTP_ACCEPT'] = 'text/html ,' + env['HTTP_ACCEPT']
    end

    status, headers, response = @app.call(env)

    [status, headers, response ]
  end

  def is_msie?(env)
    env['HTTP_USER_AGENT'] =~ /MSIE/
  end

  def has_format?(env)
    !(env['HTTP_ACCEPT'].include?("*/*"))
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¡ya está!  Ahora solamente tenemos que decirle a Rails que cargue nuestro &lt;em&gt;middleware&lt;/em&gt;, por ejemplo en &lt;code&gt;config/environment.rb&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Rails::Initializer.run do |config|
  # Settings in config/environments/* take precedence over those specified here.
  # Application configuration should go into files in config/initializers
  # -- all .rb files in that directory are automatically loaded.

  # Add additional load paths for your own custom dirs
  # config.load_paths += %W( #{RAILS_ROOT}/extras )

  config.middleware.use "FixMSIEAcceptHeader"
  ...
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Podemos comprobar que está todo listo ejecutando &lt;code&gt;rake middleware&lt;/code&gt; en el raíz de nuestra aplicación:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;use Rack::Lock
use ActionController::Failsafe
use ActionController::Reloader
use ActionController::Session::CookieStore, #&amp;lt;Proc:0x01af6a08@(eval):8&amp;gt;
use ActionController::RewindableInput
use ActionController::ParamsParser
use Rack::MethodOverride
use Rack::Head
use FixMSIEAcceptHeader
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
run ActionController::Dispatcher.new
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;como se ve, en la versión 2.3 mucha de la funcionalidad clásica de Rails se encuentra ahora implementada como &lt;em&gt;middlewares&lt;/em&gt; (por ejemplo el primero es el mutex global que impide la ejecución concurrente del framework)  Estos &lt;em&gt;middlewares&lt;/em&gt; forman una cadena por la cual va pasando la petición HTTP hacia el framework y por la que volverá la respuesta, dando la oportunidad para que cada &lt;em&gt;middleware&lt;/em&gt; haga su labor.  Tenemos la posibilidad de configurar nuestros &lt;em&gt;middlwares&lt;/em&gt; en la posición que más nos convenga.&lt;/p&gt;

   </content>
 </entry>
 
 <entry>
   <title>Logs de trazas en middlewares de Rack en Rails</title>
   <link href="http://www.sobrerailes.com/2009/06/18/logger-en-rack-middleware" />
   <updated>2009-06-18T00:00:00+02:00</updated>
   <id>http://www.sobrerailes.com/2009/06/18/logger-en-rack-middleware</id>
   <content type="html">
		&lt;p&gt;Los &lt;em&gt;middlewares&lt;/em&gt; de Rack son probablemente una de las características más excitantes de las añadidas recientemente a Rails dado que permiten alterar dramáticamente todo el entorno de la petición y respuesta HTTP en forma de plugin de quita y pon. &lt;br/&gt;
&lt;/p&gt;

&lt;p&gt;Sin embargo cuando estamos desarrollando alguno de estos monstruitos nos topamos con que dentro de un &lt;em&gt;middleware&lt;/em&gt; no tenemos acceso al logger de Rails, con lo cual es difícil poner trazas.
Aunque existen &lt;em&gt;middlewares&lt;/em&gt; pensados para trazar logs en el formato de Apache, lo cual no siempre nos da la información necesaria para depurar.&lt;/p&gt;

&lt;p&gt;Siempre podemos salir del paso con...&lt;/p&gt;

&lt;script src="http://gist.github.com/132125.js"&gt;&lt;/script&gt;


   </content>
 </entry>
 
 <entry>
   <title>Novedades en Edge Rails #21</title>
   <link href="http://www.sobrerailes.com/2009/04/25/novedades-en-edge-rails-21" />
   <updated>2009-04-25T00:00:00+02:00</updated>
   <id>http://www.sobrerailes.com/2009/04/25/novedades-en-edge-rails-21</id>
   <content type="html">
		&lt;table style="border:1px solid black;" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Esta entrada es una traducción de la publicada por Mike Gunderloy el 24 de Abril de 2009 en &lt;a href="http://weblog.rubyonrails.org/2009/4/24/this-week-in-edge-rails"&gt;el blog de Ruby on Rails&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Durante la última semana se han estado realizando operaciones quirúrgicas en Edge Rails, en preparación para un lanzamiento alfa de Rails 3.0 en la RailsConf.  Hemos visto unas 5 entreags en la rama maestra de Github durante esta semana.  He aquí una visión general de los cambios más recientes.&lt;/p&gt;


&lt;p&gt;&lt;b&gt;Cambios en Rails 2.3.x&lt;/b&gt;&lt;/p&gt;


&lt;p&gt;Antes de empezar con los cambios en la rama maestra, ha habido un par de entregas en la rama &lt;tt&gt;2-3-stable&lt;/tt&gt;, que ya han sido trasladadas a la rama maestra.&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;Se han corregido un par de errores que tenían que ver con las condiciones en hashes, especialmente para garantizar que &lt;code&gt;:dependent =&amp;gt; :delete&lt;/code&gt; funcionará en todos los casos.&lt;/li&gt;

&lt;li&gt;El adaptador de Active Record para PostgreSQL ahora hace lo correcto si utilizamos tablas en esquemas distintos a los de por defecto.  Por supuesto hay que poner el nombre de tabla en la clase del modelo, por supuesto: &lt;code&gt;set_table_name 'other_schema.customers'&lt;/code&gt; &lt;a href="http://github.com/rails/rails/commit/60601234708b34c81dcd6a58a0cad79a7520ce10"&gt;commit&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;También en el adaptador de PostgreSQL se han corregido un par de bugs relativos al entrecomillado incorrecto de nombres con letras mayúsculas.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;b&gt;Refactorización de ActionView::Path&lt;/b&gt;&lt;/p&gt;


&lt;p&gt;Una gran parte de los cambios de esta semana en Rails 3 vienen dados por la continuación del trabajo de refactorización de ActionPack.  Esta vez el objetivo era &lt;code&gt;ActionView::Path&lt;/code&gt;.  En &lt;a href="http://github.com/rails/rails/commit/0a132c2fe13fb2b8d5dade9cf6abd70601376287"&gt;estrega&lt;/a&gt; se incluye el desacoplamiento de &lt;code&gt;ActionView::Path&lt;/code&gt;, ActionController y ActionMailer, lo que conlleva dos beneficios. En primer lugar el código es más fácil de mantener y comprender porque se encuentra consolidado en un único lugar.  Y en segundo, al abstraer este tipo de cosas y dar una API clara se permite que otros componentes participen en la capa del controlador, además de los mailers y los controladores tradicionales.&lt;/p&gt;


&lt;p&gt;Queda bastante por hacer en el futuro: el plan es desacoplar también las plantillas del sistema de archivos, así como desacoplar las traducciones de ActionView.  ¡Permanezcan atentos!&lt;/p&gt;


&lt;p&gt;&lt;b&gt;Soporte JSON de quita y pon&lt;/b&gt;&lt;/p&gt;


&lt;p&gt;Tal vez recuerden que Rails recibió hace poco el soporte XML de quita y pon.  Esta semana, gracias al trabajo de Rick Olson, le toca el turno a &lt;a href="http://github.com/rails/rails/commit/3c4c6bd0df598f865f49a983b4c65c415af4bcfc"&gt;JSON&lt;/a&gt;, lo que significa que podemos reemplazar el soporte de JSON por defecto basado en YAML por la gema JSON:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
ActiveSupport::JSON.backend = "JSONGem" 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
Como parte de este cambio Rails ahora utiliza  &lt;code&gt;ActiveSupport::JSON.encode()&lt;/code&gt; cuando necesita generar JSON, lo que reemplaza al antiguo  &lt;code&gt;#to_json&lt;/code&gt;.  El equipo de Rails recomienda que todos hagamos lo miismo.  Si escogemos seguir utilizando &lt;code&gt;#to_json&lt;/code&gt; debemos saber que tal vez algunas librerías lo reemplacen.  Podemos utilizar este patrón para saber si estamos usando la propia definición de Rails de &lt;code&gt;#to_json&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
gem 'json'
# Se carga la gema JSON, que sobreescribe to_json
ActiveSupport::JSON.backend = "JSONGem" 

class ActiveRecord::Base
  # reeemplaza el método to_json de la gema con el de Rails
  alias to_json rails_to_json
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Active Support a la carta&lt;/b&gt;&lt;br/&gt;&lt;/p&gt;

&lt;p&gt;En Rails 2.x, &lt;code&gt;require "active_support"&lt;/code&gt; recupera todas las extensiones del core a la vez.  En Rails 3, esto sólo hace que las extensiones estén disponibles; y por tanto hay que requerir todas las que queramos usar. Muchos de los cambios de esta semana trataban de desmenuzar Active Support de forma que podamos tomar sólo lo que queramos usar y nada más.&lt;/p&gt;

&lt;p&gt;El resultado final es que es fácil escoger prestaciones de Active Support sin tener la sensación de cargar con un señor grandullón a nuestras espaldas.  Y de regalo, toda la documentación se encuentra ahora consolidada en un único sitio: la clase principal.  No hay que ir mirando en cada módulo para averiguar qué hace un método.&lt;/p&gt;

&lt;p&gt;Todas las extensiones se han reorganizado de forma que se pueden requerir directamente sin asumir que todo ActiveSupport está dipsonible.  ¿Queremos inflexiones como &lt;code&gt;"car".plugarilze&lt;/code&gt;?  Basta con hacer &lt;code&gt;require "active_support/core_exte/string/inflections"&lt;/code&gt; y las tendremos.  Nota: la implementación y organización probablemente sufrirá cambios en el futuro.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Otros cambios en Edge&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se han eliminado las extensiones de Rails a la clase Pathname, dado que sólo se usaban en un único lugar del código.  &lt;a href="http://github.com/rails/rails/commit/bd84b820188daed991756531071137dc7e0876a0"&gt;commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Se ha eliminado el soporte para DRb como almacenamiento de cache. &lt;a href="http://github.com/rails/rails/commit/595e03336f7366b5143a8af295b4e0fefbb8f294"&gt;commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;El adaptador de SQLite se une al de PostgreSQL en el soporte de resoluciones de microsegundos. &lt;a href="http://github.com/rails/rails/commit/504d16ccdfcd689eac31c1646957b06cc0ce55d1"&gt;commit&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;


   </content>
 </entry>
 
 <entry>
   <title>Novedades en Edge Rails #20</title>
   <link href="http://www.sobrerailes.com/2009/04/18/novedades-en-edge-rails-20" />
   <updated>2009-04-18T00:00:00+02:00</updated>
   <id>http://www.sobrerailes.com/2009/04/18/novedades-en-edge-rails-20</id>
   <content type="html">
		&lt;table style="border:1px solid black;" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Esta entrada es una traducción de la publicada por Mike Gunderloy el 17 de Abril de 2009 en &lt;a href="http://weblog.rubyonrails.org/2009/4/17/this-week-in-edge-rails"&gt;el blog de Ruby on Rails&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Por si se les ha escapado la última hora: la rama &lt;em&gt;edge&lt;/em&gt; se ha despertado y comienzan a aparecer los cambios relacionados con Rails 3 en la &lt;a href="http://github.com/rails/rails/tree/master"&gt;rama maestra en Github&lt;/a&gt;.  Así que vamos a tener mucho que tratar esta semana.  Si desean profundizar en la historia técnica detrás de la rearquitectura en Rails 3, lo mejor es seguir los muy detallados posts que viene publicando &lt;a href="http://yehudakatz.com/"&gt;Yehuda Katz&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;b&gt;¿Que rama debería usar?&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;El trabajo de lo que será Rails 3.0 se está efectuando en la rama master del repositorio Rails en Github.  Si queremos estar al día con los últimos cambios esta es la rama a seguir, con la advertencia de que se trata de código alfa, si bien es perfecta posible construir una aplicación totalmente operativa utilizando la rama maestra de Rails.  El equipo del core de Rails se ha conjurado para hacer que esta rama principal pase todos los tests, y de hecho una de las mejoras en Rails 3 es mejorar la covertura y políticas de integración continua en los tests.  Pero es importante que tengan en cuenta que los cambios en Rails harán que algunos plugins tengan que ser reescritos antes de funcionar bien en Rails 3 (por supuesto, habrá plugins que necesiten más trabajo que otros)  Esto hará que sea complicado utilizar Rails en despliegues en producción durante algún tiempo.&lt;/p&gt;


&lt;p&gt;Para las aplicaciones existentes en producción, deberemos seguir los cambios en la rama &lt;tt&gt;2-3-stable&lt;/tt&gt; en GitHub.  Esta rama contiene correcciones y mejoras en el código de la versión 2.3, y deberá permanecer compatible con los códigos y plugins que venimos usando.&lt;/p&gt;


&lt;p&gt;&lt;b&gt;¿Debo seguir enviando parches a Rails&lt;/b&gt;&lt;/p&gt;


&lt;p&gt;¡Absolutamente!  Rails siempre ha sido una &lt;a href="http://rails-contributors.hashref.com/contributors"&gt;obra de muchos&lt;/a&gt; y en Rails 3 esto no va a cambiar. Recibimos parches tanto para Rails 2.3 o Rails 3.0; por favor utilicen la etiqueta apropiada (&lt;tt&gt;2-3-stable&lt;/tt&gt; o &lt;tt&gt;3.0&lt;/tt&gt;) en los tickets de Lighthouse para que sea fácil distinguir en qué rama están basados y probados sus parches.  La &lt;a href="http://guides.rubyonrails.org/contributing_to_rails.html"&gt;guía para contribuir a Rails&lt;/a&gt; les ayudará en la mecánica de enviar un parche a Rails.&lt;/p&gt;


&lt;p&gt;David resumió la &lt;a href="http://weblog.rubyonrails.org/2008/12/23/merb-gets-merged-into-rails-3"&gt;visión general para Rails 3&lt;/a&gt; en diciembre y este sigue siendo el plan básico.  Si hay algo en lo que deseamos involucrarnos la lista &lt;a href="http://groups.google.com/group/rubyonrails-core"&gt;Ruby on Rails: Core&lt;/a&gt; nos ayudará a ponernos en contacto con el equipo de desarrollo para coordinar los planes y evitar dolores de cabeza.  La mayoría de las tareas ya están en marcha, pero sabemos que las ideas y contribuciones de la comunidad son esenciales para que Rails 3 tenga éxito.&lt;/p&gt;


&lt;p&gt;&lt;b&gt;Cambios en Rails 2.3.x&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Centrándonos en Rails 2.3, en las últimas semanas hemos visto algunas correcciones, y una funcionalidad bastante interesante: &lt;code&gt;ActiveRecord::Base#touch&lt;/code&gt;. La idea es que conseguimos un atajo para insertar la hora actual en los campos &lt;code&gt;updated_at&lt;/code&gt; y &lt;code&gt;updated_on&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
@customer.touch
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lo que hace que esto sea algo más que un ahorro de pulsaciones el teclado es que también está implementado como opción en las asociaciones &lt;code&gt;belongs_to&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
class Order &amp;lt; ActiveRecord::Base
    belongs_to :customer, :touch =&amp;gt; :last_order_update
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con esta declaración, al guardar o destruir un objeto &lt;tt&gt;Order&lt;/tt&gt; se actualizará el campo correspondiente en el objeto padre &lt;tt&gt;Customer&lt;/tt&gt;.  Esto puede ser muy útil cuando estamos tratando de invalidar una copia cacheada del padre.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/rails/rails/commit/50e867480a265b9ef60401ab0d394d9baeb5b95e"&gt;commit&lt;/a&gt; &lt;a href="http://github.com/rails/rails/commit/fa750e08a8d8c9f07afd88e616284549598926e2"&gt;commit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Cambios en Rails 3.0&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Al igual que en la 2.3, &lt;code&gt;ActiveRecord::Base#touch&lt;/code&gt; también se ha añadido a Rails 3.0.  Por lo general va a ser siempre este el caso: cualquier nueva funcionalidad en Rails 2.3 se va a propagar a Rails 3.  El equipo del core dedica especial esfuerzo para asegurar que la actualización a Rails 3 sea sencilla cuando se produzca el cambio de versión.  Pero ha habido más funcionalidades nuevas en Rails 3, y de eso vamos a tratar en el resto de la anotación.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Organización modular&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Hay algunas partes del código de Rails donde hay niveles múltiples de inclusión, herencia y configuración.  Como parte del esfuerzo para que sea más fácil entender qué es lo que hace, Rails 3 introduce las nuevas abstracciones &lt;code&gt;depends_on&lt;/code&gt;, &lt;code&gt;use&lt;/code&gt; y &lt;code&gt;setup&lt;/code&gt;, que deberían hacer más legible y obvio lo que hace el código:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
module AbstractController
  module Helpers
    depends_on Renderer

    setup do
      ...
    end
    ...
  end
end

module ActionController
  class Base2 &amp;lt; AbstractBase
    use AbstractController::Callbacks
    use AbstractController::Helpers
    ...
  end
end
&lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;a href="http://github.com/rails/rails/commit/c1aa5b0e14cd4bd27a5d8bd85cf7c36fa5911830"&gt;commit&lt;/a&gt; &lt;a href="http://yehudakatz.com/2009/04/07/better-module-organization/"&gt;más información&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;AbstractController&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Probablemente el cambio arquitectural más grande hasta ahora en Rails 3 es la introducción de la clase base &lt;code&gt;AbstractController&lt;/code&gt;.  Se trata de una nueva implementación de la funcionalidad compartida entre &lt;code&gt;ActionController::Base&lt;/code&gt; y &lt;code&gt;ActionMailer::Base&lt;/code&gt;.  La intención no es sólo proporcionar código que utilizarán las aplicaciones y los plugins directamente, sino también construir una API sólida sobre la que puedan depender otras cosas.  Por ejemplo, un consumidor de &lt;code&gt;AbstractController&lt;/code&gt; podrá implementar su propia lógica para encontrar plantillas, o añadir opciones adicionales al método básico &lt;code&gt;render&lt;/code&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;a href="http://github.com/rails/rails/commit/95c9718118bc0342ddb320f23b5e0a17fb12b7ad"&gt;commit&lt;/a&gt; &lt;a href="http://github.com/rails/rails/commit/3cecbc21e37f772a72917f80c53a7645f81d94c5"&gt;commit&lt;/a&gt; &lt;a href="http://yehudakatz.com/2009/03/20/another-dispatch-abstractcontroller/"&gt;Más información&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;ActionDispatch&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Otro cambio de arquitectura es la introducción de &lt;code&gt;ActionDispatch&lt;/code&lt;.  Se trata de un nuevo miembro de la familia de Action Pack, y existe como hogar de todas los &lt;em&gt;middlewares&lt;/em&gt; y librerías HTTP que antes vivían en &lt;code&gt;ActionController&lt;/code&gt;, incluyendo cosas como la gestión de peticiones, análisis de parámetros, códigos de estado, y nuestra propia copia de Rack. &lt;a href="http://github.com/rails/rails/commit/319ae4628f4e0058de3e40e4ca7791b17e45e70c"&gt;commit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Definición de la superficie de trabajo&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Uno de los objetivos de Rails 3 es distinguir claramente entre los métodos públicos de API en los que pueden confiar las aplicaciones y los plugins y los métodos internos de Rails que podrían estar sujetos a cambios.  Un ejemplo de esto puede ser la refactorizaión que se ha hecho en &lt;code&gt;ActionView::Template&lt;/code&gt;. Aquí el cambio ha consistido en identificar laos métodos que no son usados por ninguna otra clase y hacerlos privados.  Esto hace que se pueda entender de manera más clara la API de esta clase y a largo plazo significa que le dará a los plugins un &lt;em&gt;contrato&lt;/em&gt; acerca de cómo pueden interactuar con el código del core.  Después de que esta superficie de trabajo se haya definido formalmente, probablemente dará lugar a una API más limpia.  &lt;a href="http://github.com/rails/rails/commit/d39f5f18bbe60c13e671fc9c7a8eec8e7b4fc42b#diff-0"&gt;commit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;AJAX y los testigos de autenticación&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Si hemos estado escribiendo mucho javascript a mano, habremos descubierto la molestia de tener que incluir el testigo de autenticación de Rails en nuestras peticiones.  Un análisis más detallado del problema revela que realmente no es necesario incluir este testigo en las peticiones AJAX porque la política del origen único que aplican los navegadores ya las protege. Así que Rails 3 dejará de coprobar estos testigos en las peticiones AJAX, así que tendremos un poquito menos de javascript que escribir. &lt;a href="http://github.com/rails/rails/commit/256b0ee8e3c1610967dfc89f864e24b98ed3c236"&gt;commit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Mejoras en los tests&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Otra área de trabajo en Rails 3 consiste en poner al día los tests internos con las mejores prácticas.  Hay algunos puntos en el códgo donde los tests son menos sistemáticos de lo que podrían ser; los cambios se han venido aplicando con cobertura de tests pero nadie se ha ocupado de garantizar que haya una cobertura de test completa del flujo de ejecución de una petición &lt;em&gt;feliz&lt;/em&gt;.  Para echar un vistazo a lo que se viene haciendo en este aspecto, véase algunos de los ficheros de test en  &lt;code&gt;actionpack/test/new_base&lt;/code&gt; (el código &lt;tt&gt;new_base&lt;/tt&gt; es una reescritura en curso de &lt;code&gt;ActionController::Base&lt;/code&gt;).  También se está trabajando en mejorar las historias de integración continua y agrupar algunos tests de integración de altov nivel que puedan ejercitar Rails como un todo.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Cabos sueltos&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Hay algunas funcionalidades de Rails 2.3 que aún no están implementadas en la rama 3.0.  Algunos cambios no han podido ser fusionados con la nueva arquitectura y otros están siendo vueltos a implementar de diferente manera.  Encontrarán más detalles en este &lt;a href="http://github.com/rails/rails/commit/906aebceedb95d8caa6db6314bc90f605bdfaf2b"&gt;mensaje de entrega&lt;/a&gt; pero las piezas que faltan incluyen la mejora de rendimiento en el procesado de plantillas en modo de desarrollo y su recompilación en producción, así como alguna lógica en el código que las escoge.   Los desarrolladores han manifestado su intención de hacer que intentan conseguir la paridad de funcionalidades lo antes posible.  De hecho ya se ha hecho una pasada sobre estos cambios: &lt;a href="http://github.com/rails/rails/commit/3c1187699a80e0c4a003f5693389595cd644390f"&gt;committed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Eliminado: Soporte de CGI&lt;/b&gt;&lt;/p&gt;

&lt;P&gt;Rails 3 dejará de servir peticiones a través de CGI.  Esto fue declarado a extinguir en Rails 2.3 así que no debería sorprender a nadie que se elimine por completo.  Por supuesto, si necesitan procesar CGI por algún motivo recuerden que se soporta a través de Rack.  &lt;a href="http://github.com/rails/rails/commit/4a3afe0b4f4193d8f35827c5550727f98c6b63e9"&gt;commit&lt;/a&gt;&lt;/p&gt;


   </content>
 </entry>
 
 <entry>
   <title>Novedades en Edge Rails #19</title>
   <link href="http://www.sobrerailes.com/2009/04/04/novedades-en-edge-rails-19" />
   <updated>2009-04-04T00:00:00+02:00</updated>
   <id>http://www.sobrerailes.com/2009/04/04/novedades-en-edge-rails-19</id>
   <content type="html">
		&lt;table style="border:1px solid black;" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Esta entrada es una traducción de la publicada por Mike Gunderloy el 3 de Abril de 2009 en &lt;a href="http://weblog.rubyonrails.org/2009/4/3/this-week-in-edge-rails"&gt;el blog de Ruby on Rails&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Todo ha estado también bastante tranquilo esta semana en la rama de desarrollo: sólo ha habido 5 entregas.  Aún no se fusionado en la rama maestra todo el trabajo hacia Rails 3.0, así que si necesitamos cualquiera de los parches posteriores a la versión 2.3 aún podemos actualizarnos a la rama &lt;em&gt;edge&lt;/em&gt; sin preocuparnos.&lt;/p&gt;


&lt;p&gt;&lt;b&gt;Cambios&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;¿Cuando 24 horas no equivalen a un día...?  Cuando nos movemos a través de la fecha de cambio de horario de verano a invierno.  O, al menos, hasta que se ha aplicado este &lt;a href="http://github.com/rails/rails/commit/5a8b481f717470b952ac7eb890f260ea98428153"&gt;parche&lt;/a&gt;.  Podemos leer más detalles en el &lt;a href="https://rails.lighthouseapp.com/projects/8994/tickets/2066"&gt;ticket en Lighthouse&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;¿Has mirado últimamente en &lt;tt&gt;/rails/info/properties&lt;/tt&gt;?  Mira otra vez después de &lt;a href="http://github.com/rails/rails/commit/cad3e8b261a8d9551bc19a57007acf574d957548"&gt;esta entrega&lt;/a&gt; y aparecerán todos los módulos Rack que tengamos instalados en nuestra aplicación.&lt;/li&gt;
&lt;/ul&gt;


   </content>
 </entry>
 
 <entry>
   <title>Novedades en Edge Rails #18</title>
   <link href="http://www.sobrerailes.com/2009/03/28/novedades-en-edge-rails-18" />
   <updated>2009-03-28T00:00:00+01:00</updated>
   <id>http://www.sobrerailes.com/2009/03/28/novedades-en-edge-rails-18</id>
   <content type="html">
		&lt;table style="border:1px solid black;" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Esta entrada es una traducción de la publicada por Mike Gunderloy el 27 de Marzo de 2009 en &lt;a href="http://weblog.rubyonrails.org/2009/3/27/this-week-in-edge-rails"&gt;el blog de Ruby on Rails&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Ha sido una semana aparentemente tranquila en Rails; tan sólo ha habido una docena de entregas durante estos siete días.  Pero entre bastidores se está trabajando para fusionar lo avanzando en Rails 3.0 en la rama maestra del repositorio de git.  Les tendremos al tanto.&lt;/p&gt;


&lt;p&gt;Mientras tanto, se han resuelto algunos problemas menores de la verisón 2.3:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;Ahora se gestionan adecuadamente los parámetros en los tests con muchas peticiones POST en el mismo bloque. &lt;a href="http://github.com/rails/rails/commit/8fa4275a72c334fe945dada6113fa0153ca28c87"&gt;commit&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Ahora funciona en Windows &lt;code&gt;render :file&lt;/code&gt; con rutas absolutas. &lt;a href="http://github.com/rails/rails/commit/e3b166aab37ddc2fbab030b146eb61713b91bf55"&gt;commit&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;El reconocimiento de extensiones de plantillas se ha hecho más robusto (si han tenido problemas con archivos parecidos a &lt;tt&gt;show.erb.orig&lt;/tt&gt;). &lt;a href="http://github.com/rails/rails/commit/ae9f258e03c9fd5088da12c1c6cd216cc89a01f7"&gt;commit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Por último, recordar que si han tenido algún problema con Rails 2.3, nos gustaría saber de ellos y nos encantaría aún más si proporcionasen un caso de prueba del error o un parche.  Comprueben los detalles en la guía &lt;a href="http://guides.rubyonrails.org/contributing_to_rails.html"&gt;Contributing to Rails&lt;/a&gt;.&lt;/p&gt;


   </content>
 </entry>
 
 <entry>
   <title>Novedades en Edge Rails #17</title>
   <link href="http://www.sobrerailes.com/2009/03/23/novedades-en-edge-rails-17-2" />
   <updated>2009-03-23T00:00:00+01:00</updated>
   <id>http://www.sobrerailes.com/2009/03/23/novedades-en-edge-rails-17-2</id>
   <content type="html">
		&lt;table style="border:1px solid black;" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Esta entrada es una traducción de la publicada por Mike Gunderloy el 20 de Marzo de 2009 en &lt;a href="http://weblog.rubyonrails.org/2009/3/20/this-week-in-edge-rails"&gt;el blog de Ruby on Rails&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Por supuesto la gran novedad de esta semana en Rails ha sido el &lt;a href="http://weblog.rubyonrails.org/2009/3/16/rails-2-3-templates-engines-rack-metal-much-more"&gt;lanzamiento de Rails 2.3&lt;/a&gt;.  Pero desde luego esto no significa que la historia de Rails Edge ha concluido antes bien nos estamos embarcando en uno de los proyectos más ambiciosos relacionados con Rails: la creación de Rails 3.0  Continúen leyendo para ver dónde estamos.&lt;/p&gt;


&lt;p&gt;&lt;b&gt;Cambios finales en 2.3&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Algunas cosas fueron incluidas en Rails 2.3 en los días anteriores a su lanzamiento:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;Transacciones en el lenguaje de definición de datos para bases de datos SQLite&lt;a href="http://github.com/rails/rails/commit/ac3848201dfd7400708d3ccae0acb9388318fb99"&gt;commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Compatibilidad entre &lt;code&gt;render :file&lt;/code&gt; y &lt;code&gt;Pathname&lt;/code&gt; &lt;a href="http://github.com/rails/rails/commit/7706b57034e91820cf83445aede57c54ab66ac2d"&gt;commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Convenciones de denominación de clases de ActionController para Metal &lt;a href="http://github.com/rails/rails/commit/5f10533949457e3797c8f0b51eb30a9268bceb4d"&gt;commit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;b&gt; Rails 2.3.2.1&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Muy poco después de la publicación de Rails 2.3, que era la versión 2.3.2, se hizo necesario crear una etiqueta 2.3.2.1 porque a la versión etiquetada como 2.3.2 en el repositorio de Rails le falta una corrección importante (la versión instalable por gemas sí la incluye)  En resumidas cuentas &lt;code&gt;rake rails:freeze:edge RELEASE=2.3.2&lt;/code&gt; congelaría la versión equivocada de Rails en nuestra aplicación.&lt;/p&gt;


&lt;p&gt;Para corregirlo, el equipo de Rails ha reetiquetado el árbol principal en un punto seguro, después de la corrección.  Esta nueva etiqueta es la versión 2.3.2.1 así que si estamos congelando Rails 2.3 en nuestra aplicación (en lugar de instalarlo como gema) debemos asegurarnos de utilizar &lt;code&gt;rake rails:freeze:edge RELEASE=2.3.2.1&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;&lt;b&gt;El camino a Rails 3.0&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;Ahora que 2.3 está en la calle, ¿qué viene después?  Rails 3.0, que ha sido un hito distante en el horizonte hasta ahora, se acerca con más velocidad.  El equipo del core de Rails está discutiendo exactamente como proceder, pero debemos quedarnos con la idea de que dentro de poco veremos una &lt;em&gt;gran&lt;/em&gt; cantidad de cambios en la versión inestable de Rails, según el trabajo que ha ido desarrollándose en diferentes forks del repositorio comienza a fusionarse en la rama maestra.   Tendremos que ser cautos a la hora de utilizar la versión &lt;em&gt;edge&lt;/em&gt; en las aplicaciones ya existentes.  En particular, los cambios en el interior de Rails puede hacer que muchas extensiones tengan que ser reescritas.  La versión de desarrollo de Rails continuará siendo el último grito, pero tendremos que estar al tanto de los cambios y estar preparados para trabajar con ellos si escogemos utilizar esta versión en desarrollo de Rails.&lt;/p&gt;


&lt;p&gt;Pero esto tampoco quiere decir que Rails 2 se haya quedado congelada en el tiempo.  Hay una nueva rama  &lt;a href="http://github.com/rails/rails/commits/2-3-stable"&gt;2-3-stable&lt;/a&gt; en el repositorio de Rails que alojará todas las revisiones de mantenimiento que sean necesarios en la rama actual.  Se continuará trabajando para garantizar que las versiones 2.x funcionan bien pero el centro de gravedad de Rails rápidamente se desplazará hacia Rails 3.0.&lt;/p&gt;


&lt;p&gt;Así que permanezcan a la escucha.  Continuaremos publicando los avances en el desarrollo de Rails 3.0 según vayan ocurriendo.  El proceso será, como siempre, transparente y cualquier idea o comentario serán bienvenidos.&lt;/p&gt;


   </content>
 </entry>
 
 <entry>
   <title>Novedades en Edge Rails #16</title>
   <link href="http://www.sobrerailes.com/2009/03/20/novedades-en-edge-rails-16" />
   <updated>2009-03-20T00:00:00+01:00</updated>
   <id>http://www.sobrerailes.com/2009/03/20/novedades-en-edge-rails-16</id>
   <content type="html">
		&lt;table style="border:1px solid black;" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Esta entrada es una traducción de la publicada por Mike Gunderloy el 13 de Marzo de 2009 en &lt;a href="http://weblog.rubyonrails.org/2009/3/13/this-week-in-edge-rails"&gt;el blog de Ruby on Rails&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Ha habido mucho ajetreo en la parte de desarrollo desde el lanzamiento de &lt;a href="http://weblog.rubyonrails.org/2009/3/5/rails-2-3-rc2-final-stop-before-release"&gt;Rails 2.3 &lt;span class="caps"&gt;RC2&lt;/span&gt;&lt;/a&gt;. El equipo del core ha estado haciendo un serio esfuerzo para revisar todos los errores abiertos y parches enviados con vista a tener una versión sólida.  En este punto, el listón para aceptar nuevas funcionalidades está bastante alto pero incluso así ha habido 94 entregas esta semana desde RC2.  En su mayoría son correcciones para garantizar el comportamiento y estabilidad esperados.  He aquí lo más destacado.
&lt;/p&gt;


&lt;h2&gt;Parsers intercambiables para XMLmini&lt;/h2&gt;


&lt;p&gt;El soporte para lectura de XML en ActiveSupport se ha hecho más flexible permitiéndonos quitar y poner diferentes analizadores.  Por defecto, utiliza la implementación estándar REXML pero se puede especificar fácilmente las implementaciones LibXML o Nokogiri en nuestras propias aplicaciones siempre que tengamos por supuesto las gemas instaladas:&lt;/p&gt;


&lt;pre name="code" class="ruby"&gt;
XmlMini.backend = 'LibXML'
XmlMini.backend = 'Nokogiri'
&lt;/pre&gt;


&lt;p&gt;&lt;a href="http://github.com/rails/rails/commit/822c41d69d9228c9912d29ac45155d3a16bb5c50"&gt;commit&lt;/a&gt; &lt;a href="http://github.com/rails/rails/commit/694998ee4fb8d257ba78424cab630846327a0889"&gt;commit&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Reescritura de la tarea &lt;code&gt;rake gem&lt;/code&gt;&lt;/h2&gt;


&lt;p&gt;Las interioridades de las varias tareas &lt;code&gt;rake gem&lt;/code&gt; se han revisado de manera sustancial para que el sistema funcione mejor en una variedad de casos.  El sistema de gemas ahora conoce las distintas dependencias de los entornos de desarrollo y producción, tiene un sistema de desempaquetado más robusto, da más información cuando se le pregunta acerca del estado de las gemas y es menos dado a tener problemas de dependencias (del estilo de la gallina y el huevo) cuando se instala todo desde cero.  También hay correcciones del uso del comando &lt;code&gt;gem&lt;/code&gt; bajo JRuby y para las dependencias que intentan instalar copias externas de gemas que ya están en el directorio &lt;code&gt;/vendor&lt;/code&gt;

&lt;/p&gt;&lt;p&gt;&lt;a href="http://github.com/rails/rails/commit/99d75a7b02bf430a124b9c3e2515850959d78acf"&gt;commit&lt;/a&gt; &lt;a href="http://github.com/rails/rails/commit/5b751ae0b3f6c10a1053e4a2e04fd92d228d787f"&gt;commit&lt;/a&gt; &lt;a href="http://github.com/rails/rails/commit/9d906707bea997016fd370e33e12dbc21cfcc531"&gt;commit&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Correcciones en las rutas&lt;/h2&gt;


&lt;p&gt;Ha habido un par de correcciones menores en el motor de rutas.  En primer lugar, las rutas miembro con requisitos funcionan ahora (anteriormente se ignoraban estos requisitos):&lt;/p&gt;


&lt;pre name="code" class="ruby"&gt;
map.resources :orders, 
   :requirements =&gt; { :id =&gt; %r([^/;,?]+) }, 
   :member =&gt; { :accept =&gt; :get }
&lt;/pre&gt;


&lt;p&gt;&lt;a href="http://github.com/rails/rails/commit/5b7527ca44521edf9782b3d7f449bf09a29267f2"&gt;commit&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;También las rutas &lt;em&gt;llanas&lt;/em&gt; funcionan adecuadamente con los espacios de nombre (&lt;a href="http://github.com/rails/rails/commit/5c87e9adddc22703a3dbbb785e32fafe0e91ce78"&gt;commit&lt;/a&gt;) y podemos utilizar ahora el verbo &lt;code&gt;OPTIONS&lt;/code&gt; en las condiciones de la ruta (&lt;a href="http://github.com/rails/rails/commit/5e0f6214d2421a4931c85ee6a239158c69e57b65"&gt;commit&lt;/a&gt;).&lt;/p&gt;


&lt;h2&gt;Mejoras en la caché del lado del cliente&lt;/h2&gt;


&lt;p&gt;Los métodos &lt;code&gt;expires_in&lt;/code&gt;, &lt;code&gt;stale&lt;/code&gt;, y &lt;code&gt;fresh_when&lt;/code&gt; aceptan la opción &lt;code&gt;:public&lt;/code&gt; para que funcionen adecuadamente bajo proxies de caché.&lt;/p&gt;


&lt;pre name="code" class="ruby"&gt;
  expires_in 10.minutes, :public =&gt; true
  fresh_when :last_modified =&gt; @user.updated_at.utc, 
             :public =&gt; true
  fresh_when :etag =&gt; @user, :public =&gt; true
&lt;/pre&gt;


&lt;p&gt;&lt;a href="http://github.com/rails/rails/commit/f2a32bd0dedf11021027e36cc2c99f97434cae17"&gt;commit&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Esto y lo otro&lt;/h2&gt;


&lt;p&gt;El método &lt;code&gt;String#parameterize&lt;/code&gt; ahora acepta un carácter separador opcional.&lt;/p&gt;


&lt;pre name="code" class="ruby"&gt;
  "Mi gran pato".parameterize =&gt;      "mi-gran-pato" 
  "Mi gran parto".parameterize('_') =&gt; "mi_gran_pato"
&lt;/pre&gt;


&lt;p&gt;&lt;a href="http://github.com/rails/rails/commit/20d3892f46c553e8ca3d4e8d223a3bd92789556d"&gt;commit&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;El método &lt;code&gt;ActiveRecord::Base#invalid?&lt;/code&gt; ahora funciona como el contrario de &lt;code&gt;ActiveRecord::Base#valid?&lt;/code&gt;. (&lt;a href="http://github.com/rails/rails/commit/96eaeee4467a03cba3c4c30aeb6fc6afe545ae1d"&gt;commit&lt;/a&gt;)&lt;/p&gt;


&lt;p&gt;El método  &lt;code&gt;ActiveSupport::Json.decode&lt;/code&gt; ahora gestiona secuencias de escape de tipo &lt;code&gt;\u0000&lt;/code&gt;. (&lt;a href="http://github.com/rails/rails/commit/9b9b2937ce3bef3bca9d22821e76c40cc74fa689"&gt;commit&lt;/a&gt;)&lt;/p&gt;


&lt;p&gt;Ahora podemos definir tipos de contenido como &lt;code&gt;multipart/mixed&lt;/code&gt; en Action Mailer. (&lt;a href="http://github.com/rails/rails/commit/1dff106888d671dac07f93711ecb319170132c56"&gt;commit&lt;/a&gt;)&lt;/p&gt;


&lt;p&gt;Rails 2.3 incluirá una versión propia de Rack, pero si tenemos instalado Rack 1.0 como gema utilizará dicha versión (&lt;a href="http://github.com/rails/rails/commit/0a887e2386a827f554c685dccf91701bb38422b5"&gt;commit&lt;/a&gt;)&lt;/p&gt;


   </content>
 </entry>
 
 <entry>
   <title>Novedades en Edge Rails #15</title>
   <link href="http://www.sobrerailes.com/2009/03/02/novedades-en-edge-rails-15" />
   <updated>2009-03-02T00:00:00+01:00</updated>
   <id>http://www.sobrerailes.com/2009/03/02/novedades-en-edge-rails-15</id>
   <content type="html">
		&lt;table style="border:1px solid black;" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Esta anotación es una traducción de la publicada el 27 de Febrero de 2009 por Mike Gunderloy en &lt;a href="http://weblog.rubyonrails.org/2009/2/27/this-week-in-edge-rails"&gt;el blog de Ruby on Rails&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;El lector avispado se habrá dado cuenta de que esta semana cubrimos no una sino dos.  Según se acerca la fecha de lanzamiento de Rails 2.3 el equipo del core es cada vez más exigente con lo que entra en el código y se concentra en arreglar errores.  Podemos esperar la versión Rails 2.3 RC2 para dentro de muy poco, y puede que sea la última candidata.  Así que si aún no han probado sus aplicaciones en Rails 2.3, ahora es el momento de hacerlo.  A estas alturas el código edge es bastante estable así que ya es hora de echarle un vistazo.&lt;/p&gt;


&lt;h2&gt;Procesado por lotes&lt;/h2&gt;


&lt;p&gt;Se pueden procesar un gran número de filas de un modelo ActiveRecord provocando menos estrés en la memoria utilizando &lt;code&gt;find_in_batches&lt;/code&gt;:&lt;/p&gt;


&lt;pre name="code" class="ruby"&gt;
Customer.find_in_batches(:conditions =&gt; {:active =&gt; true}) do |customer_group|
  customer_group.each { |customer| customer.update_account_balance! }
end
&lt;/pre&gt;


&lt;p&gt;A &lt;code&gt;find_in_batches&lt;/code&gt; se le puede pasar la mayoría de las opciones de &lt;code&gt;find&lt;/code&gt;, sin embargo no se puede especificar el orden (siempre se devolverán en orden ascendente de la clave primaria, que además tiene que ser un entero), ni utilizar la opción &lt;code&gt;:limit&lt;/code&gt;.  Para limitar el número de registros de cada lote, debe usarse la opción &lt;code&gt;:batch_size&lt;/code&gt;, que por defecto vale 10&lt;/p&gt;


&lt;p&gt;El nuevo método  &lt;code&gt;each&lt;/code&gt; es un recubrimiento de &lt;code&gt;find_in_batches&lt;/code&gt; que devuelve registros en lotes de 1000::&lt;/p&gt;


&lt;pre name="code" class="ruby"&gt;
Customer.each do |customer|
  customer.update_account_balance!
end
&lt;/pre&gt;


&lt;p&gt;Nótese que sólo se debería usar este método cuando el número de registros justifique el procesamiento por lotes: para números pequeños de filas (por ejemplo menos de 1000) deberían usarse los &lt;em&gt;finders&lt;/em&gt; normales con su propio bucle.&lt;/p&gt;


&lt;p&gt;&lt;a href="http://github.com/rails/rails/commit/d13623ca46c82120c398f4634e206422fc3ad7ea"&gt;commit&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Notas sobre la carga de plantillas&lt;/h2&gt;


&lt;p&gt;Después del trabajo exhaustivo de algunos autores (aquí está el &lt;a href="http://rails.lighthouseapp.com/projects/8994/tickets/1909"&gt;ticket de Lighthouse&lt;/a&gt;), Rails 2.3 proporciona la capacidad de habilitar o desactivar la caché de plantillas para un entorno en particular.  Las plantillas cacheadas dan un extra de velocidad porque no hace falta comprobar la existencia de un nuevo archivo de plantilla cada vez que se muestran; pero por el contrario implican que no podemos cambiar las plantillas al vuelo sin reiniciar el servidor.&lt;/p&gt;


&lt;p&gt;Por lo general querremos tener activa la caché de plantillas en producción, lo que puede hacerse configurando lo siguiente en nuestro &lt;code&gt;production.rb&lt;/code&gt;:&lt;/p&gt;


&lt;pre name="code" class="ruby"&gt;
config.action_view.cache_template_loading = true
&lt;/pre&gt;


&lt;p&gt;En las aplicaciones Rails 2.3 nuevas esta línea se generará automáticamente.  Pero obsérvese que si actualizamos el código de una aplicación Rails más antigua no tendremos este valor y la caché de plantillas estará desativada por defecto.  A no ser que estemos absolutamente seguros de que tendremos la necesidad de actualizar las plantillas en producción sin reiniciar los servidores, deberíamos asegurarnos de añadir este valor cuando actualicemos a Rails 2.3&lt;/p&gt;


   </content>
 </entry>
 
 
</feed>
