El 'problema' que me encontré con la función 'link_to_remote' es que por defecto no añade ninguna url en el atributo 'href' del enlace, lo que no sólo supone un problema para aquellos usuarios que no tengan javascript, si no a la hora de que los buscadores indexen el contenido, ya que en teoría no siguen los enlaces dentro de código javascript.
Para solucionarlo, tan sólo tuve que escribir una sencilla función en un helper que añadiese automáticamente al atributo 'href' la misma url a la que se iba a hacer la petición con Ajax:
module PublicHelperAsí, al llamar a la función ajax_link("enlace", :controller => "foo", :action => "bar"), se genería el código html <a href="/foo/bar" onclick=".." />
def ajax_link(label, url = {}, options = {})
options.merge!({:href => url_for(url)})
link_to_remote label,
{
:url => url,
:update => "section_content",
:loading => "Element.hide('section'); Element.show('loading'); ",
:complete => "Element.hide('loading');"
},
options
end
end
El siguiente incoveniente era distinguir en el controlador cuándo se estaba haciendo una petición con Ajax o se estaba pidiendo directamente la url para devolver sólo el trozo html con el contenido, o bien la página entera. Por defecto, Prototype, la librería utilizada en Rails para usar Ajax, realiza la petición a través del método POST, así que para decidir si se debía utilizar el layout tan sólo había que tener en cuenta el tipo de petición que se estaba haciendo:
class FooController < ApplicationControllerOtra opción hubiese sido mandar un parámetro adicional en la petición y luego comprobar en el controlador si éste existia y así saber si se trataba de una petición con Ajax o no.
layout "foo"
def bar
render(:action => "foobar", :layout => request.get?)
end
end
Igual sería interesante hacer esto en forma de plugin e incluir alguna funcionalidad más como añadir el código javascript a los enlaces de manera no intrusiva.