Seo urls: permalink_fu o friendly_id

2008/10/15 Emili Parreño [email protected]:

añade el método to_url a la clase String y así convierto los títulos
de los posts, articulos etc. en permalinks en plan rápido-guarro-
funcional y andando, me va de fábula.

Has testeado ese to_url con bastantes casos para verificar que
funciona correctamente?

Comentar que en Rails Edge ahora se dispone de “parameterize” que
ayudará a generar estas friendly url si necesidad de nuestros
experimentos con “to_url” … :wink:

Aqui tienes varias opciones, como siempre Google nos abre las puertas
del
maravilloso mundo del conocimiento :slight_smile:
http://www.notsostupid.com/blog/2006/07/07/urls-on-rails/
http://www.seoonrails.com/to_param-for-better-looking-urls

Gracias Emili :slight_smile:

El 15 de octubre de 2008 10:21, Francesc E. <
[email protected]> escribió:

yo la solución rápida que utilizo cuando no importa que vaya el id en la
url es algo así(evidentemente se podría mejorar para hacer algo más
reutilizable):

class Activity < ActiveRecord::Base

before_save :set_clean_title

def to_param
“#{self.id}-#{self.clean_title}”
end

private
def set_clean_title
converter = Iconv.new(‘ASCII//TRANSLIT’, ‘UTF-8’)
self.clean_title = converter.iconv(self.title).gsub(/ /,
‘-’).gsub(/[^a-z-]/in, ‘’).downcase
end

end

La parte para limpiar la cadena está sacada de The Ruby Way

Salud!

Andrés gutiérrez escribió:

A ver, el plugin friendly_id, aporta más funcionalidades de las que
aporta sobrescribir to_param, por ejemplo, si dos entradas tienen el
mismo título, les mete un identificador para diferenciarlas,
sobreescribe el método find, tiene compatibilidad hacia atras con los
otros sistemas que se hayan utilizado para garantizar que si se cambia
el esquema de la URL continuará funcionando.

En fin, que yo diria que son más que 5 lineas de código[1].

[1] friendly_id/lib/friendly_id.rb at master · norman/friendly_id · GitHub
[1] http://github.com/norman/friendly_id/tree/master/lib/slug.rb
[1]
http://github.com/norman/friendly_id/tree/master/test/sluggable_test.rb

2008/10/15 Andrés gutiérrez [email protected]:

def to_param
unless id.blank? || title.blank?
"#{id}-#{StrNormalizer.

normalize_for_url(title)}"
end
end

Por alusiones :slight_smile: Gracias javier

El 15 de octubre de 2008 11:08, javier ramirez
[email protected]escribió:

dar solucion al problema. Sería posible que alguien expusiese esta
solución al completo. Asi yo y el resto de gente que leemos este hilo
podremos hacer las url tan guays como vosotros.
Yo tengo, por ejemplo, este método definido en un modelo

def to_param
unless id.blank? || title.blank?
“#{id}-#{StrNormalizer.normalize_for_url(title)}”
end
end

normalize_for_url es un método que tengo que borra/cambia caracteres no
ascii por caracteres ascii para que vayan bien en una URL

El formato del “to_param” que quieras sacar es el que quieras, con la
única condición de que empiece por el ID. Rails cuando ejecuta un find
por id, hace un .to_i implícito, y como en Ruby cuando haces un to_i de
una cadena que empieza por números, convierte hasta el primer carácter
no numérico, te va perfecto.

Es decir, para una url tal que

/users/1-javier-ramirez-gomara

en la que el id es “1-javier-ramirez-gomara”, cuando haces un

User.find(params[:id])

realmente lo que busca es

User.find(1)

saludos,

j


javier ramírez

…i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
…you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez

Adrián Mugnolo
escribió:>> toda la

@page = @project.pages.find(params[:page_id]) # 456
/paises

  1. URL as UI

Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Aha, quizás me estaba rompiendo demasiado la cabeza, la verdad es que el
Seo me es muy importante y si cuanto más corta sea la url me ayuda a
tener un buen posicionamiento en buscadores quizás debería hacerlo como
me dices:
/proyectos/kk/pages/plantillas
/pages/plantillas/items
/pages/plantillas/items/admin_be_001

Yo pretendía tenerlo todo en la url quitando el nombre del controlador,
pero si una url más corta es más SEO que una más larga y si la mayoría
lo hace así y no toca routes será que está bien hecho así entonces, con
controladores mostrándose. Yo más que nada lo preguntaba para tener así
varias opiniones sobre cómo lo hace la gente y hacer las cosas de manera
correcta y tener un buen SEO.

En algún proyecto he definido también el to_param en algún modelo, asi
que bueno, os doy las gracias por todas las respuestas que me habeis
dado, ya tengo cosas que investigar y ver qué me merece más la pena, si
plugin o definiendo to_params. Voy a ver las posibilidades que me habeis
servido y si tengo alguna duda escribo de nuevo :-). Muchas gracias a
todos

class Customer < AR::Base
def to_param
“#{id}-#{MyAppUtils.normalize_for_url(name)}”
end
end

MyAppUtils es una clase dentro de /lib ?

El 15 de octubre de 2008 12:33, Xavier N. [email protected] escribió:

2008/10/15 Andrés gutiérrez [email protected]:

off-topic. Pero se está hablando de redefinir #to_param y en cinco lineas
dar solucion al problema. Sería posible que alguien expusiese esta solución
al completo. Asi yo y el resto de gente que leemos este hilo podremos hacer
las url tan guays como vosotros. Esto que pido creo que es algo razonable,
que no es algo que venga en uno de esos tuto de haz tu app en 15min. En fin,
sobretodo gracias

Yep, por ejemplo

class Customer < AR::Base
def to_param
“#{id}-#{MyAppUtils.normalize_for_url(name)}”
end
end

normalize_for_url es un metodo propio que normaliza la cadena para que
quede limpia en una URL:

def self.normalize(str)
return ‘’ if str.nil?
n = str.chars.downcase.strip.to_s
n.gsub!(/[à áâãäåāă]/, ‘a’)
n.gsub!(/æ/, ‘ae’)
n.gsub!(/[ďđ]/, ‘d’)
n.gsub!(/[çćčĉċ]/, ‘c’)
n.gsub!(/[èéêëēęěĕė]/, ‘e’)
n.gsub!(/Æ’/, ‘f’)
n.gsub!(/[ĝğġģ]/, ‘g’)
n.gsub!(/[ĥħ]/, ‘h’)
n.gsub!(/[ììíîïīĩĭ]/, ‘i’)
n.gsub!(/[įıijĵ]/, ‘j’)
n.gsub!(/[ķĸ]/, ‘k’)
n.gsub!(/[łľĺļŀ]/, ‘l’)
n.gsub!(/[ñńňņʼnŋ]/, ‘n’)
n.gsub!(/[òóôõöøōőŏŏ]/, ‘o’)
n.gsub!(/Å“/, ‘oe’)
n.gsub!(/Ä…/, ‘q’)
n.gsub!(/[ŕřŗ]/, ‘r’)
n.gsub!(/[śšşŝș]/, ‘s’)
n.gsub!(/[ťţŧț]/, ‘t’)
n.gsub!(/[ùúûüūůűŭũų]/, ‘u’)
n.gsub!(/ŵ/, ‘w’)
n.gsub!(/[ýÿŷ]/, ‘y’)
n.gsub!(/[žżź]/, ‘z’)
n.gsub!(/\s+/, ’ ‘)
n.delete!(’^ a-z0-9_/\-.')
n
end

def self.normalize_for_url(str)
# normalize and convert whitespace, slashes, and dots to hyphens
normalize(str).tr(‘^a-z0-9_’, ‘-’)
end

2008/10/15 Andrés gutiérrez [email protected]:

class Customer < AR::Base
def to_param
“#{id}-#{MyAppUtils.normalize_
for_url(name)}”
end
end

MyAppUtils es una clase dentro de /lib ?

Una pregunta de novato. ¿Que ventaja tiene meterlo como una
clase/modulo en vez de extender la clase String?

Yo lo tengo metido como una extension de la clase string:

http://github.com/fesplugas/simplified_permalink/tree/master/lib/simplified_permalink/string.rb

Con sus tests …

http://github.com/fesplugas/simplified_permalink/tree/master/test/string_test.rb

2008/10/15 Francesc E. [email protected]

MyAppUtils es una clase dentro de /lib ?

Una pregunta de novato. ¿Que ventaja tiene meterlo como una
clase/modulo en vez de extender la clase String?

Yo lo tengo metido como una extension de la clase string:

Ya que habláis de donde poner este código, creo que sería interesante
extender extlib, http://github.com/sam/extlib/tree/master que es un
conjunto de extensiones a los objetos básicos de ruby, en la que tal vez
sería interesante estos métodos. Para quien no la conozca extlib empezó
con
DM http://datamapper.org/ (Datamapper es la competencia de
ActiveRecord) y
ahora mismo también lo usa merb (la competencia sin magia, chula
eficiente y
rápida de rails).

PD. Perdón por el partidismo implícito.

A ver otra de novato:
Esto lo he sacado del link que me ha pasado Francesc [1]
simplified_permalink / lib / simplified_permalink / string.rb

class String

def normalize
ActiveSupport::Multibyte::Handlers::UTF8Handler.normalize(self,:d).split(//u).reject
{ |e| e.length > 1 }.join
end

def to_url
self.normalize.gsub(/\W+/, ’ ').strip.gsub(/\ +/, ‘-’).downcase
end

end

Aquí habría qe meter lo que he preguntado MyAppUtils como un metodo
más? si no es asi es que no lo pillo

[1]
http://github.com/fesplugas/simplified_permalink/tree/master/lib/simplified_permalink/string.rb

El 15 de octubre de 2008 13:16, Francesc E.
[email protected]
escribi

Empezó todo con preguntas sobre un plugin para hacer urls “bonitas”,
alguien comentó que eso eran 5 lineas de código, y ahora empezamos a
hablar de una extlib que son unas cuantas lineas más que 5. :wink:

2008/10/15 Guillermo [email protected]:

2008/10/15 Andrés gutiérrez [email protected]:

A ver otra de novato:
Esto lo he sacado del link que me ha pasado Francesc [1]
simplified_permalink / lib / simplified_permalink / string.rb

Aquí habría qe meter lo que he preguntado MyAppUtils como un metodo
más? si no es asi es que no lo pillo

Eso es una extension de la clase String.

>> "A ver otra de novato".to_url
=> "a-ver-otra-de-novato"

2008/10/15 Andrés gutiérrez [email protected]:

def normalize
ActiveSupport::Multibyte::Handlers::UTF8Handler.normalize(self,:d).split(//u).reject
{ |e| e.length > 1 }.join
end

Sin haber probado este método ¿no descarta los caracteres multibyte?

Yo utilizo este método que no descarta esos caracteres, algo mejor para
SEO:

class String
def to_permalink
(Iconv.new(‘US-ASCII//TRANSLIT’, ‘utf-8’).iconv
self).gsub(/[^\w\s-\â€"]/,‘’).gsub(/[^\w]|[_]/,’
‘).split.join(’-').downcase
end
end


David A., el único desarrollador con una orden de alejamiento de
Jeffrey Zeldman

http://simplelogica.net # (+34) 98 522 12 65

2008/10/15 Andrés gutiérrez [email protected]:

class Customer < AR::Base
def to_param
“#{id}-#{MyAppUtils.normalize_
for_url(name)}”
end
end

MyAppUtils es una clase dentro de /lib ?

En mis proyectos suelen haber cosillas que son un poco como
“transversales”, las suelo agrupar en un modulo MyAppUtils definido en
lib/my_app_utils.rb.

En cuanto a reabrir String… es otra opcion. Yo prefiero reabrir solo
cuando veo claro que esa es la mejor opcion por algun motivo. Es
decir, aumentar la API de una clase estandard en mi caso es la segunda
opcion y ha de ganarse con el sudor de su frente que tire por ahi (a
veces lo he hecho). Por defecto un modulito con cuatro o cinco
utilidades es lo que uso en este caso.

Lo abultado ahi es la normalizacion. La hago a mano porque la
controlo. La libreria iconv se comporta de manera distinta en
distintas maquinas, y la tecnica de la normalizacion Unicode pierde
algunos caracteres que quiero soportar… no se is la “ç” por ejemplo.
Hubo un thread reciente en la lista.

BTW ya que estamos, hay que tener en cuenta tb en estos slugs que si
te meten un nombre en arabe posiblemente resulte la cadena vacia (no
lo he probado). Si asumes unicidad ha de ser unicidad de la cadena
normalizada.

2008/10/15 Xavier N. [email protected]:

En cuanto a reabrir String… es otra opcion. Yo prefiero reabrir solo
cuando veo claro que esa es la mejor opcion por algun motivo. Es
decir, aumentar la API de una clase estandard en mi caso es la segunda
opcion y ha de ganarse con el sudor de su frente que tire por ahi (a
veces lo he hecho). Por defecto un modulito con cuatro o cinco
utilidades es lo que uso en este caso.

Yo normalmente tiro por extender la clase porque una de las cosas que
me gusta de Ruby es la preciosidad de código que queda.

>> "Pero que cosa más bonita".to_url
=> "pero-que-cosa-mas-bonita"

vs.

>> MyAppUtils.normalize_for_url("Con lo bonito que podria ser esto")
=> "con-lo-bonito-que-podria-ser-esto"

No se, ya hay bastantes cosas feas en el mundo como para añadir más. :wink:

(Ojo, es una opinión/opción personal, el dia que se me solapen las
cosas me acordaré de Xavier)

Off-topic::::::::::

Bueno, una de ego para mi francesc. Aun siendo novato, que lo soy
tenia razon en como pensaba que lo habia hecho xavier noooo?
No pasa nada,nadie es perfecto y acepto tus disculpas :-))))

Off-topic ::::::::::::

El día 15 de octubre de 2008 14:17, Francesc E.
[email protected]
escribió:> 2008/10/15 Xavier N. [email protected]:

2008/10/15 Francesc E. [email protected]:

Yo normalmente tiro por extender la clase porque una de las cosas que
me gusta de Ruby es la preciosidad de código que queda.

“Pero que cosa más bonita”.to_url
=> “pero-que-cosa-mas-bonita”

Si desde luego que es una opcion valida.

On Wed, Oct 15, 2008 at 1:48 PM, David A. [email protected] wrote:

Sin haber probado este método ¿no descarta los caracteres multibyte?

Si, los descarta. Pero es que algo has de hacer con ellos no?

He probado lo que has mandado y a mi no me funciona, quizas el
copy/paste no ha funcionado bien. Puedes actualizar el ejemplo que
subo con lo que crees que deberia funcionar.

http://pastie.textmate.org/private/yesbvzc9rkw3z0he2kvsq