Emili Parreño

URLs amigables en Ruby on Rails

25 Apr 2007 |

Una de las cosas que se puede hacer fácilmente en RoR es disponer de url amigables, de manera que el visitante puede situarse mejor, y lo más importante, mejorar considerablemente el posicionamiento en los buscadoreses.

Lo primero es crear un método llamado permalink que nos cambie los carácteres no válidos para una url por otros que si lo sean.

Creamos el archivo '/lib/permalink.rb'

class ActiveRecord::Base def self.use_permalink( attr ) self.class_eval <<-EOF, __FILE__, __LINE__ before_save { |r| r.permalink = r.#{attr}.to_url } EOF end end
class String def to_url # pasamos a minúsculas y quitamos caracteres no válidos y espacios result.gsub!(/[áàäâå]/, 'a') result.gsub!(/[éèëê]/, 'e') result.gsub!(/[íìïî]/, 'i') result.gsub!(/[óòöô]/, 'o') result.gsub!(/[úùüû]/, 'u') result.gsub!(/[ýÿ]/, 'y') result.gsub!(/[ñ]/, 'n') result.gsub!(/[ç]/, 'c') result.gsub!(/['"]/, '') result.gsub!(/[^a-zA-Z0-9-]/, ' '); #result.gsub!(/W/, ' ') result.gsub!(/ +/, '-') result.gsub!(/(-)$/, '') result.gsub!(/^(-)/, '') # devuelvemos el resultado result end end

Añadimos al final del fichero "config/environment.rb" la siguiente lí­nea para que tenga constancia del fichero que terminamos de crear:

require "permalink"

Supongamos que tenemos un tabla de artí­culos al estilo de un blog y queremos que la url de acceso sea del tipo /articles/nombre-del-articulo en lugar de /articles/39

Para esto debemos añadir un campo varchar a la tabla de articulos llamado permalink. A continuación editamos el modelo y añadimos

use_permalink :title

Donde :title es el campo que queremos convertir en permalink, en este caso el tí­tulo del artí­culo. Con esto automáticamente cuando se crea un artí­culo, en el campo permalink de la tabla se guarda el tí­tulo convertido en un permalink.

Ahora nos falta modificar los enlaces para que en lugar de mostrar el ID muestren el permalink. Para ello cuando queramos acceder a un artí­culo podemos poner

link_to "#{article.title}", :action => 'articles', :id => article.permalink

Lógicamente el controlador está esperando un ID, así­ que lo tenemos que modificar e indicarle que lo que va ha recibir es un permalink. Editamos el controlador y modificamos el metodo que muestra los artí­culos

def article @article = Article.find_by_permalink(params[:id]) render :action => 'viewarticle' end

Con esto conseguiremos tenes unas url más vistosas y amigbales.