URLs amigables en Ruby on Rails
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’
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:
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
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
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
@article = Article.find_by_permalink(params[:id])
render :action => ‘viewarticle’
end
Con esto conseguiremos tenes unas url más vistosas y amigbales.
4 Comentarios »
Redifusión RSS de los comentarios de la entrada.

Hola, creo que se te paso una línea en el método to_url:
result = self
Saludos!
De hecho no… result = self afectará tanto al permalink como al atributo del que se tome, más bien sería algo como:
result = self.to_s
o
result = self.downcase (en caso de querer el permalink todo en minúsculas)
Mola… Se me ocurre que podría darse el caso de permalinks repetidos. Por ejemplo, si dos artículos tienen el mismo título, con y sin acentos… al guardarse se eliminan los acentos y quedarían igual.
Para solventar esto habría que comprobar si ya existe otro modelo con ese valor en el campo, en plan validates_uniqueness, y si ya existe, se podría probar variaciones del permalink, por ejemplo añadiendo dígitos detrás, en plan “me-curre-un-plugin” y “me-curre-un-plugin-2″.
Supongo que plugins como permalink_fu tengan esto en cuenta.
sluggable_finder tiene esto en cuenta: http://tinyurl.com/5hhyyv