Sudoku on rails, v3
No es muy difícil darse cuenta de que nuestra versión de Sudoku on Rails necesita urgentemente un lavado de cara. Nos gustaría darle algo de vida al aspecto de la aplicación, y a eso nos vamos a dedicar en esta nueva edición del tutorial. Gracias a la separación de la vista del resto de nuestra aplicación, podremos hacerlo sin escribir ni una línea de código.
<p>El nuevo aspecto final podéis <a href="http://v3.sudokuonrails.com">verlo aquí</a> y podéis descargar el nuevo código desde <a href="http://www.sobrerailes.com/files/sor-3.0.tar.bz2">aquí</a></p>
<h2>Cómo sirve Rails nuestras páginas</h2>
<p>Todo lo que cuelga del directorio <tt>public/</tt> de nuestro proyecto Rails es servido de manera similar a como lo haría un servidor <em>web</em> tradicional. De hecho, es servidor por el servidor web bajo el que corramos nuestra aplicación, sin pasar por el intérprete Ruby.</p>
<p>Para el caso del contenido dinámico (y como ya vimos en el post anterior) cuando se invoca una acción de un controlador se sirve un fichero <tt>.rhtml</tt>, la vista por defecto que se sirve es <tt>views/layouts/controlador/accion.rhtml</tt>, o bien en nuestro controlador podemos indicar otra vista mediante <tt>render_action</tt>_. Estos ficheros <tt>.rhtml</tt> consisten en fragmentos de <span class="caps">HTML</span> mezclados con código Ruby.</p>
<p>Pero esto no es todo, el código generado por nuestra vista o <em>layout</em> no es lo que se envía al navegador. De momento basta con que sepamos que podemos definir una plantilla o vista a nivel de aplicación (<tt>app/views/layouts/application.rhtml</tt>) en la que se encaje el texto <span class="caps">HTML</span> generado por las vistas de cualquier controlador usando el <em>tag</em> <tt>content_for_layout</tt></p>
<p>Obviamente, RoR no acaba aquí sino que va bastante más lejos, pero de momento nos bastará con quedarnos con esto.</p>
<h2>Estrategia para trabajar lo menos posible</h2>
<p>Para nuestro lavado de cara, nos bastará con realizar nuestro diseño (o bien, como en este caso, fusilar uno de <a href="http://www.oswd.org"><span class="caps">OSWD</span></a> ) y copiar los recursos estáticos en su correspondiente subidrectorio, <tt>public/images</tt> y <tt>public/stylesheets</tt> por lo general). Luego, sólo tenemos que generar algo parecido al<tt>index.html</tt> de nuestro diseño usando <tt>application.rhtml</tt> y recordar incluir la hoja de estilos no con una referencia directa sino con <tt>stylesheet_link_tag</tt>. Igualmente si incluyésemos imágenes, usaríamos <tt>image_tag</tt>, tal y como nos explican <a href="http://wiki.rubyonrails.com/rails/pages/HowToLinkToStaticFile/">en esta página del wiki de RoR</a></p>
<p>Por cierto, hemos usado <a href="http://www.oswd.org/design/preview/id/2457/">este tema diseñado por Minimal Laboo</a></p>
<h2>Páginas adicionales estáticas</h2>
<p>En nuestra nueva versión, queremos tener una pequeña página que de alguna información sobre el juego del sudoku. Esta página en teoría sería contenido meramente estático así que podríamos incluirla directamente como <tt>public/acerca.html</tt> y hacer referencia a ella desde nuestras plantillas.</p>
<p>Pero esta página tendría que ser un fichero <span class="caps">HTML</span> estático, de forma que no podríamos aprovechar la descomposición de la que hemos hablado antes (una plantilla principal <span class="caps">RHTML</span> + código <span class="caps">RHTML</span> generado por el controlador). Si decidimos cambiar el aspecto de nuestra aplicación modificando <tt>application.rhtml</tt>, tendremos que editar a mano este fichero. Mala cosa.</p>
<p>La posibilidad más sencilla para salir al paso de este problema es inventarnos una nueva acción de nuestro controlador, llamada <tt>acerca</tt>, cuyo código es trivial:</p>
def acerca
end
<p>Por defecto, Rails cargará la vista <tt>acerca.rhtml</tt> donde, sin complicarnos la vida, escribimos en <span class="caps">HTML</span> tradicional una pequeña descripción del juego y ponemos algunos enlaces (en el código que os podeis descargar veréis que en la acción se hace una cosita más: se borra el contenido de <tt>flash[:note]</tt> para no repetir el último mensaje visualizado por el controlador)</p>
<p>De esta manera, nuestra página “Acerca de…” (que por lo demás no tiene contenido dinámico) tendrá el aspecto global de nuestra aplicación de manera inmediata. El inconveniente es que esta página es servida por Rails, no por el servidor web, y supondrá una carga adicional en nuestro servidor.</p>
