Actualizar de Rails 1.1.6 a Rails 1.2.3
Después de haber esperado prudentemente la evolución de los lanzamientos de las veriones de Rails 1.2.x hasta convencerme de su estabilidad, finalmente decidí no postergar más la inevitable decisión de actualizar todos mis desarrollos desde la versión anterior 1.1.6 que tanto me sirvió el último año.
Aprovechando la experiencia de otros antes de mí, mi tarea no fué tan traumática como podía esperar, sin embargo, hay algunas consideraciones personales que debí superar sin ninguna referencia previa que quizás también sean útiles para otros en la misma encrucijada.
Actualizar a Gems >= 0.9
Primero que todo, Rails 1.2 requiere de la versión 0.9 o superior de RubyGems, así que si tenemos cualquier versión anterior debemos actualizarnos de inmediato usando:
gem update --system
Editar environment.rb
Aquellos proyectos generados usando Rails 1.1.6 (y no aquellos actualizados desde su anterior versión 1.0) incluían la siguiente línea en su archivo conf/environment.rb
RAILS_GEM_VERSION = '1.1.6'
Y como bien dice su descripción, ésta indica qué versión del gem de Rails usar si éste no se encuentra "freezado" en el directorio vendor/rails. Pero aún cuando desinstalé el gem de Rails 1.1.6 y todas sus dependencias depués de instalar su versión 1.2.3 (usando gem cleanup), la tarea para actualizar todos los archivos del proyecto de Rails fallaba silenciosamente.
El error se hizo evidente usando esta vez:
rake rails:update --trace
Que ahora arrojaba este mensaje:
Cannot find gem for Rails =1.1.6:
Install the missing gem with 'gem install -v=1.1.6 rails', or
change environment.rb to define RAILS_GEM_VERSION with your desired version.
Mi solución fué entonces comentar la línea problemática y ejecutar nuevamente rake rails:update, aunque también podría haber sido cambiar el valor de RAILS_GEM_VERSION, como sugería la advertencia.
El infierno de los formularios
Los cambios introducidos en la sintaxis de los formularios en los templates erb de Rails 1.2.3 son quizás los más engorrosos de aplicar, pues prácticamente no hay forma de escapar de ellos. Estos cambios están afortundamente bien documentados, pero una es importante realizar una aclaración sobre la forma en que se modfica su uso si usamos archivos parciales:
<% form_for :story do |form| %>
<%= render :partial => 'form', :object => form %>
<% end %>
En el código anterior tenermos un formulario para editar un objeto @story usando el archivo parcial "form.rhtml". En este caso, debemos pasar el objeto en el nuevo bloque de código del formulario al archivo parcial explícitamente usando :object => form. Luego el archivo parcial contendría algo así como:
<p>
<label>Title:</label>
<%= form.text_field :title, :size => 63 %>
</p>
Nota: El hecho de que el objeto se llame "form", al igual que el archivo del parcial, es sólo una coincidencia. De cualquier manera, el uso de :object => es obligatorio en el caso de que trabajemos con formularios de esta manera; de otra forma los formularios no funcionarán correctamente.
Todo a UTF-8
Al contrario que en nuestros despreocupados días de PHP (y de las versiones preliminares de Rails si mal no recuerdo) la codificación de caracteres que usemos no es un detalle menor, especialmente para nosotros los hispanoparlantes y los caracteres especiales de nuestro idioma. Si de pronto nos encontramos viendo extraños caracteres donde debíamos ver eñes, acentos y/o signos de puntuación, entonces nos topamos con un viejo problema que afortunadamente tiene una buena solución.
Advertencia: Plugins
Rails 1.2.3 incluye cambios estructurales que bien podrían resultar en incompatibilidades con algunos plugins que tengamos instalados en proyectos producidos con versiones anteriores del framework. Si algunas funcionalidades críticas de nuestra aplicación dependen del correcto funcionamiento de estos plugins, entonces recomiendo revisar el estado de su soporte actual para la última versión de Rails antes de considerar cualquier actualización.
Mi experiencia con los pocos plugins con los que encontré problemas fué la siguiente.
Problemas con el plugin acts-as-taggable
Mi versión instalada del plugin acts-as-taggable incluía una asociación del tipo has_many ... :dependent => true en su archivo acts-as-taggable.rb, sintaxis que está declarada como obsoleta en Rails 1.2.3 y reemplazada por la forma has_many ... :dependent => :destroy.
Obviamente, instalar una versión más reciente el plugin hubiera sido una solución mejor... pero no tan rápida.
Problemas con el plugin simple-access-control
Este utilísimo plugin me viene salvando de la tarea de implementar un sencillo control acceso limitado por roles desde hace un buen tiempo. Sin embargo, la última revisión en su repositorio (51 al momento de escribir esto) no funciona con Rails 1.2.3. El archivo lib/simple_access_control.rb contiene una modificación con respecto a la versión que utilicé con Rails 1.1.6 que aparententemente produciría la incompatiblidad; para colmo, su autor es muy hostil con respecto a las novedades en Rails 1.2 (!).
La solución: reemplazar ese archivo con su versión anterior.
Repasar los .log inevitablemente
Los archivos de logging de Rails son invaluablemente expresivos al reportar cualquier advertencia de "depreciaciones" en nuestra aplicación, así que es obligatorio repasarlos detenidamente en busca de cualquier detalle que se nos haya pasado por alto antes de considerar nuestra tarea de actalización como exitosamente concluída.
Resumen y recopilación
Actualizar todos mis sitios de Rails 1.1.6 a Rails 1.2.3 fué una tarea más laboriosa que hacerlo desde Rails 1.0 a Rails 1.1.6, pero afortunadamente nada que no pudiera realizar muy cuidadosamente en un fin de semana completo. Luego, las ventajas añadidas de contar con la última versión del framework preferido en Ruby superaron mis expectativas rápidamente. El desempeño de mis sitios actualizados continuó inmutable y los nuevos resultaron igualmente estables.
Pero más importante, abrazar las actualizaciones de Rails y asimilarlas como las más correctas es renovar nuestro compromiso con las mejores prácticas de desarrollo que eligimos al optar por RoR.