Sudoku on Rails, v4
Dado que desde que cambiamos el aspecto de nuestra aplicacíón recibimos decenas de visitas diarias, deseamos instalar un contador para ver de dónde viene la gente (ejem, lo de que deseamos poner un contador es cierto, lo de que recibimos visitas es una pequeña exageración). En esto de los contadores los hay para todos los gustos, desde los todopoderosos contadores de Google Analytics hasta los de Nedstat que tienen la simpática costumbre de meter publicidad intrusiva en la web que los incluye. También existen contadores basados en scripts PHP que se instalan en nuestro propio servidor, como Mint e incluso ya existe un contador basado en Rails, Weed. Nosotros optaremos por una solución más tradicional: Statcounter
<h3>Una solución rápida</h3>
<p>Con <a href="http://www.statcounter.com">Statcounter</a> la cosa es muy sencilla, tras darnos de alta y configurar nuestro sitio web, nos proporcionan un fragmento de código mezcla de Javascript y <span class="caps">HTML</span> que debemos incluir en nuestra página. La primera aproximación es incluir este código directamente en nuestra plantilla de aplicación (<tt>app/views/layouts/application.rhtml</tt>).</p>
<p>Esta solución tiene dos inconvenientes: el primero es que el fragmento de código es relativamente largo y si lo incluimos en nuestra plantilla principal ésta se complica bastante. El segundo inconveniente es más conceptual: el contador no aporta nada a nuestra aplicación, debería estar fuera de la plantilla principal y, a ser posible, en un sitio apartado, lejos del resto de cosas.</p>
<p>Y además, no me serviría de ejemplo para lo que viene a continuación.</p>
<h3>Introducción a los Parciales</h3>
<p>Los parciales (<em>partials</em>) son fragmentos de .rhtml (es decir, <span class="caps">HTML</span> con Ruby embebido) que pueden ser incluidos desde otra vista. Los únicos requisitos son dos: que el nombre del fichero .rhtml donde guardemos el parcial empiece por ’_’ y que incluyamos el parcial desde nuestra vista principal usando <tt><%= render(:partial => “miparcial.rhtml”) %></tt>.</p>
<p>Por defecto, Rails supone que los parciales viven en el mismo directorio de la vista del controlador que los incluye (<tt>app/views/<controlador></tt>), pero si en la clave <tt>:partial</tt> incluimos una ruta, Rails la construirá a partir de <tt>app/views</tt>, de forma que podamos compartir este parcial entre diferentes controladores.</p>
<h3>Manos a la obra</h3>
<p>Simplemente creamos el fichero <tt>app/views/shared/_statcounter.rhtml</tt> , y pegamos en él el fragmento de código de Statcounter para nuestra web. Luego, en <tt>app/views/layouts/application.rhtml</tt> añadimos en el lugar adecuado</p>
<%= render(:partial => "shared/statcounter") %>
<p>Y no tenemos que hacer nada más. Teneis la nueva versión <a href="http://v4.sudokuonrails.com">aquí</a> y el código fuente, <a href="http://www.sobrerailes.com/files/sor-4.0.tar.bz2">aquí</a></p>
<h3>Más sobre los parciales</h3>
<p>La utilidad de los parciales va más allá de incluir fragmentos de <span class="caps">HTML</span> en nuestra aplicación, como hemos hecho hoy. De hecho, lo más interesante de los parciales es que, al llevar Ruby embebido, pueden recibir objetos de nuestra aplicación y manipularlos.</p>
<p>Por ejemplo, podríamos tener un parcial para mostrar una lista de la compra de nuestra aplicación, que recibiese los elementos del carrito desde la vista de un controlador y que tuviese código Ruby para, por ejemplo, sumar el total de los elementos para mostrar el precio, con <span class="caps">IVA</span> o sin <span class="caps">IVA</span> según alguna variable escogida por el usuario, algo así como</p>
<%= render(:partial => 'carrito',
:object => @articulos,
:locals => { :con_iva => @mostrar_iva }) %>
<p>(En el <em>hash</em> <tt>locals</tt> podemos definir las variables locales que serán visibles por el parcial)</p>
