Seo urls: permalink_fu o friendly_id


#1

Hola, para el nuevo proyecto que tengo que hacer quiero meter urls
amigables. En otros proyectos he usado permalink_fu y me ha funcionado
correctamente, pero googleando me he encontrado con friendly_id [1],
alguno lo ha probado? qué me recomendais, permalink_fu, friendly_id o
algún otro?

Ahora estoy con rails 2.0, imagino que no habría ningún problema en usar
algún plugin de éstos, es que permalink_fu lo usaba con 1.1.6, imagino
que podré seguir usándolo ahora también.

Gracias, y un saludo

[1] http://agilewebdevelopment.com/plugins/friendly_id


#2

Miguel Angel Calleja L.
escribió:> Gracias, y un saludo

[1] http://agilewebdevelopment.com/plugins/friendly_id


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es

Me ha entrado una duda sobre la construcción de mi url, si tengo:
proyectos/1/pages/1/items/1

Con algún plugin de éstos podría pasar a:
proyectos/kk/pages/plantillas/items/admin_be_001

Mi duda es si puedo convertir esta última url en algo como
así:proyectos/kk/plantillas/admin_be_001

Había pensado en crear pages como controdalores individuales, estaría
bien si pages no variara pero pueden aumentarse con el tiempo. Se puede
hacer algo? Gracias


#3

2008/10/14 Miguel Angel Calleja L. removed_email_address@domain.invalid:

Gracias, y un saludo

Con algún plugin de éstos podría pasar a:
proyectos/kk/pages/plantillas/items/admin_be_001

Mi duda es si puedo convertir esta última url en algo como así:
proyectos/kk/plantillas/admin_be_001

Había pensado en crear pages como controdalores individuales, estaría
bien si pages no variara pero pueden aumentarse con el tiempo. Se puede
hacer algo? Gracias

Yo use Resource Hacks [1] para esto en un proyecto. Funcionó, aunque
tuve algunos líos con los url helpers cuando estaba activo.

[1]
http://archive.jvoorhis.com/articles/2006/08/01/announcing-resource_hacks

¡Falta Uno! - http://www.falta-uno.com.ar/
Ricardo M.


#4

Ricardo M.
escribió:>>> algún plugin de éstos, es que permalink_fu lo usaba con 1.1.6, imagino

hacer algo? Gracias

Yo use Resource Hacks [1] para esto en un proyecto. Funcionó, aunque
tuve algunos líos con los url helpers cuando estaba activo.

[1] http://archive.jvoorhis.com/articles/2006/08/01/announcing-resource_hacks

Aha, podría hacer algo como
así?1)
map.resources :proyectos do |proy|
proy.resources :pages, :member_path =>
‘/proyectos/:nombre_proyecto/:permalink’ do |page|
page.resources :items, :member_path
=>’/proyectos/:nombre_proyecto/:permalink/:id’
end
end

Las rutas que podría generar serían:
/proyectos/kk/plantillas -> todo el CRUD lo hace en el controlador pages

/proyectos/kk/plantillas/admin_be_001 -> iría al controlador items

Si no, se me ocurre tal como hacía con el permalink, crear rutas, lo que
pasa es que pueden ser muchas y mi routes podría ser inmenso.
map.connect ‘proyectos/:nombre_proyecto/:permalink’, :controller =>
‘pages’, :action => ‘index’
map.connect ‘proyectos/:nombre_proyecto/:permalink/:id’, :controller =>
‘items’, :action => ‘show’

Lo primero estaría correcto? Muchas gracias


#5

2008/10/14 Miguel Angel Calleja L. removed_email_address@domain.invalid

Hola, para el nuevo proyecto que tengo que hacer quiero meter urls
amigables. En otros proyectos he usado permalink_fu y me ha funcionado
correctamente, pero googleando me he encontrado con friendly_id [1],
alguno lo ha probado? qué me recomendais, permalink_fu, friendly_id o
algún otro?

Yo estoy contento con sluggable_finder:

http://wiki.rubyonrails.org/rails/pages/sluggable_finder


#6

Es cierto no tiene ni un test, pero me gusta como trabaja.

De todas formas para lo que Miguel Angel necesita es algo más de
configurar
bien el routes.rb que otra cosa.

Para lo de las paginas no te he entendido bien Miguel Angel, dices de
crear
un controlador por cada página?

Yo tengo un controlador para todas las paginas, y haría algo como

/pages/la-pagina
:controller => “pages”, :action => “show”, :id => “la-pagina”

On Tue, Oct 14, 2008 at 1:51 PM, Francesc E. <


#7

On Tue, Oct 14, 2008 at 1:31 PM, Jaime I. removed_email_address@domain.invalid
wrote:

Yo estoy contento con sluggable_finder:

http://wiki.rubyonrails.org/rails/pages/sluggable_finder

No tiene ni un test [1].

-1

[1]
http://code.estadobeta.com/plugins/sluggable_finder/test/sluggable_finder_test.rb


#8

Ceritium
escribió:> /pages/la-pagina

>
removed_email_address@domain.invalid <mailto:removed_email_address@domain.invalid>

Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es

Hola de nuevo, me explico, en mi routes tendría ésto:

map.resources :proyectos do |proy|
proy.resources :pages do |page|
page.resources :items
end
end

Pero lo que no quiero es que salgan rutas
así:
proyectos/:id/pages/:id/items/id

A parte de usar un plugin para seo si que tengo que configurar también las
rutas para que quede
así:
proyectos/kk/plantillas/admin_be_001 por ejemplo, quitar el pages y el
items de la ruta.

Entonces, gracias al consejo de Ricardo, usando Resource Hacks, no se si
podría hacer algo
así:
map.resources :proyectos do |proy|
proy.resources :pages, :member_path =>
‘/proyectos/:nombre_proyecto/:permalink’ do |page|
page.resources :items, :member_path
=>’/proyectos/:nombre_proyecto/:permalink/:id’
end
end

Las rutas que podría generar serían:
/proyectos/kk/plantillas -> todo el CRUD lo hace en el controlador pages

/proyectos/kk/plantillas/admin_be_001 -> iría al controlador items

No se si sería correcto…

O bien, como he hecho alguna vez en otros proyectos y con permalink_fu
tratar las rutas, lo que pasa es que si hago ésto me veo un routes enorme.

map.connect ‘proyectos/:nombre_proyecto/:permalink’, :controller =>
‘pages’, :action => ‘index’
map.connect ‘proyectos/:nombre_proyecto/:permalink/:id’, :controller =>
‘items’, :action => ‘show’

Si alguien ha hecho algo parecido o cómo soleis hacerlo, agredecería mucho
vuestra ayuda. Gracias


#9

On Oct 14, 2008, at 11:49 AM, Adrián Mugnolo wrote:

La idea es que la relación que representa la ruta REST (por ejemplo,
para un has_many) en realidad existe entre padre-hijo y no entre
abuelo-padre-hijo (no hay información de los nietos en los abuelos, si
no a través de los padres).

Fe de erratas: quise decir precisamente lo contrario. :slight_smile:

No hay información de los abuelos en los nietos si no a través de sus
padres.


#10

On Oct 14, 2008, at 10:38 AM, Miguel Angel Calleja L. wrote:

Hola de nuevo, me explico, en mi routes tendría ésto:

map.resources :proyectos do |proy|
proy.resources :pages do |page|
page.resources :items
end
end

El bueno de Jamis B. tiene una máxima [1] citada en Rails Way y por
todas partes que dice: casi nunca está bien anidar recursos más de un
nivel.

La idea es que la relación que representa la ruta REST (por ejemplo,
para un has_many) en realidad existe entre padre-hijo y no entre
abuelo-padre-hijo (no hay información de los nietos en los abuelos, si
no a través de los padres).

Quedaría algo
así:
map.resources :projects, :as => “proyectos” do |project|
project.resources :pages, :as => “paginas”
end
map.resources :pages, :as => “paginas” do |pages|
pages.resources :items
end
map.resources :items

Saludos

  1. http://weblog.jamisbuck.org/2007/2/5/nesting-resources

#11

On Oct 14, 2008, at 12:38 PM, Miguel Angel Calleja L. wrote:

Aha, he leido, así las url serían más cortas pero perdería toda la
información que quiero mostrar en la url, el proyecto, la página y el
item, se que entre abuelo y nieto no hay relación, pero me interesa
que
se muestre el proyecto para saber en dónde estoy mientras que si lo
hago
de esa forma perdería ese dato y no pretendo éso, quiero mostrar
toda la
información posible en la url

Si lo que dice la url es muy importante para tu aplicación, está
perfecto así. Sólo que para ser consistente tal vez deberías
asegurarte de que todos los niveles sean válidos:

/proyectos/123/paginas/456/items/789

@project = Project.find(params[:project_id]) # 123
@page = @project.pages.find(params[:page_id]) # 456
@item = @page.items.find(params[:id]) # 789

¡Amén! :slight_smile:

Hace poco vi un ejemplo parecido con ciudades:

/paises/argentina/provincias/rio-negro/ciudades/bariloche

En mi opinión, es más claro, flexible y hasta más relevante tener:

/paises
/paises/argentina
/paises/argentina/provincias
/paises/argentina/provincias/rio-negro
/provincias/rio-negro/ciudades
/provincias/rio-negro/ciudades/bariloche

De paso, también se puede tener:

/provincias (todas las provincias, no importa el país)
/ciudades (todas las ciudades, no importa el país ni la provincia)

Si es por el SEO, cuantos más términos pongas en la url, menos
“pesará” cada uno.

En parte, lo “amigable” de las urls también pasa porque sean
relativamente cortas, de un largo manejable por los usuarios, etc.
Según Jakob Nielsen las urls desde siempre fueron parte de la IU de la
web [1]. ¿Quién no pasó alguna vez por la odisea de pegar una url en
un email, que se corte, que después no se pueda hacer clic, o que haya
que “pegarla”, etc.?

  1. http://www.useit.com/alertbox/990321.html

#12

Adrián Mugnolo
escribió:>>

Quedaría algo así:

  1. http://weblog.jamisbuck.org/2007/2/5/nesting-resources

Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es

Aha, he leido, así las url serían más cortas pero perdería toda la
información que quiero mostrar en la url, el proyecto, la página y el
item, se que entre abuelo y nieto no hay relación, pero me interesa que
se muestre el proyecto para saber en dónde estoy mientras que si lo hago
de esa forma perdería ese dato y no pretendo éso, quiero mostrar toda la
información posible en la url

Quizás si hago un

map.resources :projects, :as => “proyectos” do |project|
project.resources :pages, :as => “paginas”
end

map.with_options :path_prefix => ‘/proyectos/:proyecto’ do |proy|

proy.resources :pages, :as => “paginas” do |pages|
pages.resources :items
end

end

Haría lo mismo que en la anidación, al final y al cabo me interesa que
se muestre
así:
proyectos/kk/plantillas/admin_be_001 donde,

kk es el nombre del proyecto
plantillas es el nombre de la página
admin_be_001 es el nombre del item

en vez de:
proyectos/kk/pages/plantillas
pages/plantillas/items/admin_be_001
items/admin_be_001

o

proyectos/kk/pages/plantillas/items/admin_be_001

Hacerlo de una u otra forma me daría igual siempre y cuando mostrase los
3 datos en la url para tener constancia de dónde se está, pero en vez de
ser tan larga recortarla como quiero, me gustaría saber si puedo
convertir esta ruta:

proyectos/kk/pages/plantillas/items/admin_be_001
en

proyectos/kk/plantillas/admin_be_001

Imagino que podría hacer algo como:
map.connect ‘/proyectos/:proyecto/:pagina’, :controller=>‘paginas’,
:action=>‘index’
map.connect ‘/proyectos/:proyecto/:pagina/:item’, :controller=>‘items’,
:action=>‘show’

Bueno, no se si estoy haciendo el burro o qué… se puede, hay alguna
manera sencilla?


#13

Yo no uso plugins para esto, redefino #to_param y las rutas van solas
sin necesidad de tocar routes.rb. Anidadas, etc. Vaya que va solo.


#14

On Oct 14, 2008, at 4:24 PM, Xavier N. wrote:

Yo no uso plugins para esto, redefino #to_param y las rutas van solas
sin necesidad de tocar routes.rb. Anidadas, etc. Vaya que va solo.


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es

Xavier,

Eso funciona si puedes mantener el id numérico en el to_param. En
algunos casos (por ejemplo, si no quieres que la competencia sepa
cuántos clientes registrados tienes en tu aplicación) conviene
directamente evitar el acceso por id numérico. Friendly_id permite
eso sobrecargando el método find de acuerdo a una implementación de
to_param.

class Member < ActiveRecord::Base
has_friendly_id :login
end

Member.find(“xavier”)
Member.find(“123-xavier”) # es “backwards-compatible”
Member.find(123) # idem

redirect_to @member # “/members/xavier”

Saludos


#15

2008/10/14 Xavier N. removed_email_address@domain.invalid:

Yo no uso plugins para esto, redefino #to_param y las rutas van solas
sin necesidad de tocar routes.rb. Anidadas, etc. Vaya que va solo.


Yo estoy contigo Xavi, muchas veces parece que la posibilidad de usar
un plugin nos “atonta” un poco, es algo que resuelves con 4 líneas,
defines to_param, y cambias

find(params[:id])

por

find(:first, :conditions => { :loquesea => params[:id] }) || raise
RecordNotFound

(o algo parecido).

Además yo soy mucho de usar una técnica que creo que también te leí a
tí, definir un método target o scope con eso, así que eso, es sólo una
vez.

Otra cosa es que muchos recursos de nuestra aplicación quieran usar
URLs guays y nos queramos definir un par de métodos en /lib que nos
definan ese par de cosas, pero sinceramente, tardas menos en
implementarlo (son 5 líneas que escribes en 10 minutos) que en
estudiar qué plugin te convence más y en instalarlo.

Aunque para gustos, colores =;-)


Sergio Gil Pérez de la Manga
e-mail > removed_email_address@domain.invalid
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras


#16

2008/10/14 Francesc E. removed_email_address@domain.invalid

Que por cierto en Rails 2.2 tendremos algo como:

Model.find_by_something!(params[:id])

Que tirará un RecordNotFound en vez de mil.

Hasta ahora hacía esto.

Model.find_by_something(params[:id]) or raise ActiveRecord::NotFound

Como sigan metiendo tantas facilidades, algún día será tan fácil que
será
aburrido, y harás la aplicación en apenas 20 lineas.


#17

Que por cierto en Rails 2.2 tendremos algo como:

Model.find_by_something!(params[:id])

Que tirará un RecordNotFound en vez de mil.

On 14/10/2008, at 23:27, “Sergio Gil Pérez de la Manga”
<removed_email_address@domain.invalid


#18

Yo como comentan Xavi y Porras no me complico la vida con plugins, o
redefino #to_param o uso una libreria que me hice hace tiempo que
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.

Emili
Parreñowww.eparreno.com
www.abecedata.com


#19

Hola cracks, espero que lo que voy a preguntar no lo considereis morro
ni
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

El 15 de octubre de 2008 9:36, Emili Parreño removed_email_address@domain.invalid
escribió:


#20

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
http://www.jroller.com/obie/entry/seo_optimization_of_urls_in

El 15/10/2008, a las 9:58, Andrés gutiérrez escribió:

Yo como comentan Xavi y Porras no me complico la vida con plugins, o
www.eparreno.com


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es

Emili Parreño
www.eparreno.com
www.abecedata.com