URLs amigables en Ruby on Rails

25 de Abril, 2007 — 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’

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.

4 Comentarios »

  1. Hola, creo que se te paso una línea en el método to_url:

    result = self

    Saludos!

    Comentario por Edgar J. Suárez — 16 de Marzo, 2008 @ 7:07
  2. 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)

    Comentario por Edgar J. Suárez — 16 de Marzo, 2008 @ 7:29
  3. 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.

    Comentario por Jaime Iniesta — 16 de Mayo, 2008 @ 4:23
  4. sluggable_finder tiene esto en cuenta: http://tinyurl.com/5hhyyv

    Comentario por Jaime Iniesta — 16 de Mayo, 2008 @ 4:26

Redifusión RSS de los comentarios de la entrada.

Deje un comentario

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License. | Emili Parreño