Receta Grails: Marcar una pestaña como actual

Es bastante habitual en el desarrollo web que, teniendo un sistema de pestañas, se requiera marcar la que corresponde a la actual. Esto habitualmente se realiza con listas y CSS, luego comprobando programáticamente qué se está ejecutando y aplicar el estilo al elemento correspondiente.


<ul>
<li class="act"> <a href="...">News</a></li>
<li><a href="...">Forum</a></li>
...
...
</ul>

Tanto con Grails como con cualquier framework podemos acceder a la petición en la vista, comprobar los parámetros para ver qué elemento de la lista es el actual, y en cada elemento de la lista comprobar si se la acción está relacionada con dicho elemento para asignarle el class. En fin, nuestra vista quedaría algo así:


<ul>
<li ${(params.controller=='news' &&(!params.action || params.action=='index'))?'class="act"':''}><g.link controller="news">News</g.link></li>
<li ${(params.controller=='forum' && params.action=='last')?'class="act"':''}><g.link controller="forum" action="last">Forum</g.link></li>
...
...
</ul>

Pero gracias al sistema de taglibs de grails, lo podemos hacer de forma mucho más limpia y más DRY.

Creamos un taglib, por ejemplo TabsTagLib:

grails create-tag-lib tabs

Ya se nos habrá creado en nuestrapp/grails-app/taglib/TabsTagLib.groovy, donde deberemos añadir una closure que actuará como nuestro tag para esto, el código quedará algo así:


class TabsTagLib {
 def actualTabWithLink={ attrs, body ->
  def selectedClass=(attrs.controller==controllerName && (attrs.action?attrs.action==actionName:true))?'class="act"':''
  out << '<li '+selectedClass+'>'+ g.link(attrs){body()}+'</li>'
 }
}

Y nuestra visa pasaría a quedar así:

<ul>
<actualTabWithLink controller="news"> News </actualTabWithLink>
<actualTabWithLink controller="forum" action="last"> Forum </actualTabWithLink>
...
...
</ul>

La explicación rápida del taglib(para más información la documentación de taglibs de Grails):

(attrs, body ->) attrs son atributos del tag(controller, action...) y body el cuerpo dentro del tag(en nuestro caso News o Forum).

Comparamos controllerName y actionName con los atributos pasados al taglib, attrs.controller siempre y el attrs.action éste último sólo si tiene valor. Si el resultado es que es el actual asignamos a selectedClass class="act", si no es así una cadena vacía.

Como desde un taglib podemos acceder a otros taglibs, llamamos al taglib g.link de forma parecida a la vista, en este caso le pasamos todos los atributos y el cuerpo que vengan de la llamada a actualTabWithLink g.link(attrs){body()}, que nos devolverá la cadena del link.

Por último, sólo debemos concatenar la cadena del link a los tags li con el class="act" en el controller/action actual y hacemos el append a la variable implícita out, que no es otra cosa que el Writer de salida.

En fin, que esta es una forma simple de aprovechar los taglibs de Grails para tener un código mucho más legible en las vistas y más DRY. Veáse también que de ésta forma no debemos preocuparnos de los cambios de mapping de URLs ni de si un acción es la de por defecto en un controller, que entonces no es necesario especificarla en la URL para que se ejecute. También hay que tener en cuenta que para éste caso sólo controlamos los controllers y actions, nos encontraremos en casos dónde podríamos necesitar controlar algún otro parámetro.

Ranking de blogs sobre desarrollo de software

Descubro gracias al blog de Ferrán Rodenas, un recopilación del Top 100 de blogs sobre desarrollo de software.

Para confeccionar el ranking se han tenido en cuenta varias estadísticas: el page rank de Google, la autoridad en Technorati, el ranking de Alexa, los hits en google y los comentarios de los últimos 10 posts de cada blog.

Algunos, al menos para mi, eran de esperar que estuvieran entre los primeros(Joel Spolsky, Jeff Atwood, Martin Fowler, Paul Graham...). A unos pocos del top 100 los sigo en mi lector de feeds, en algunos otros blogs acabo pasando de vez en cuando y otros muchos del ranking no los conocía, habrá que pasearse por el listado a ver cuáles son del gusto de cada uno :P.

Cursos del CTA 2008-2009

Hoy mismo, me ha llegado un email avisándome que ya está disponible el calendario de cursos del Centro de Tecnologías Avanzadas de Zaragoza.

En el calendario del programa TIC hay cursos de administración de Linux y Windows Server, networking(estoy hablando de redes :P), seguridad, gestión de proyectos...

Pero cómo era de esperar los primeros que estoy mirando son los de programación :), y parece que se repiten bastantes del año pasado. De los que he estado viendo, me interesan:

El de Java ME y el de Spring+Hibernate+Struts2, el primero salirme un poco del sólo web y el segundo más que nada por ver Struts2. Otro que me parece medio interesante es el de Java EE para ver algo de JMS, EJB3 e incluso de Struts2 que además incluye gratuito el examen de certificación SCJP(¿no sería mejor un curso de preparación para esto?); pero me parece un poco coñazo ver Servlets y JSPs.

Habrá que ver si puedo sacar tiempo durante 2 o 3 semanas para asistir a alguno de estos curso o me vuelvo a quedar sin hacer ninguno, ya que parece que los autónomos también podemos inscribirnos :)

También hay algunos cursos más de Java, además de PHP+MySQL(también incluye examen de certificación a PHP5) y de .Net; o incluso de CICS y SAP(si lo que quieres es ganar más dinero programando...).

Aún siendo cursos de programación que, además de ser gratuitos, no sacan mala pinta; para mi falta algún curso sobre algún framework algo más novedosos/ágil en cuanto a desarrollo web tipo Ruby on Rails, Grails, Zend Framework, Django, Symfony... aunque en el tiempo que sigo los cursos que salen del CTA, no suelen destacar por ser early adopters y sí por ser bastante enterprisey.

Por cierto, que en el boletín de Septiembre, ya salen los cursos disponibles para octubre en los que ya se puede hacer la pre-inscripción.

Los eventos que vienen

Parece que tras el verano se van acumulando eventos en España más o menos interesantes para los que vivimos de esto del desarrollo web, aquí van los eventos que conozco y que estoy pensando en asistir antes de final de año:

Google Developer Day (25 de sepiembre en Madrid) a éste ya tengo asegurada la asistencia, gracias a las invitaciones por ir a charlar del Summer of Code en la Campus Party.

Fundamentos Web (27 y 28 de octubre en Gijón) del que siempre me han hablado bien, además que estando en modo turista me encantó la ciudad, pero no me termina de convencer el programa junto al precio del evento.

Conferencia Rails (13 y 14 de noviembre en Madrid) para el que tengo los días marcados en el calendario y espero no tener problema para ir.

Congreso de Webmasters (21, 22 y 23 de noviembre en Madrid) que en principio no me termina de convencer, quizás por parecer estar más orientado al lado de negocio que al lado técnico y siendo que la semana anterior es la conferencia rails, es muy probable que se caiga de mi agenda.

Otro evento al que asistiré sí o sí ;), aunque sin fecha todavía planeado para el 9 de Octubre en Madrid, es a la presentación de la plataforma para la creación de redes sociales tog.

¿Alguien conoce más eventos interesantes para desarrolladores?