Fwd: RESTful y urls amigables

:slight_smile:

---------- Forwarded message ----------
From: Fernando G. [email protected]
Date: 2008/9/29
Subject: RESTful y urls amigables
To: [email protected]

Hola gente,

Estoy haciendo mi primera aplicación RESTful :slight_smile:

Me encuentro que si creo las rutas usando resources:

map.resources :channels do |channel|
channel.resources :sentences do |sentence|
end

Me crea rutas de esta tipo:

/channels/:channel_id/sentences/:id/edit

Mi pregunta es: a partir de aquí para tener la aplicación con rutas
amigables:

/channels/:channel_slug/sentences/:slug/edit

Hay algún método recomendado o simplemente dejo las rutas así:

/channels/:channel_id/sentences/:id/edit

Y modifico los controladores para que params[:channel_id] en relidad,
para mí, sea :channel_slug?

por ejemplo:

el link:
link_to @sentence.name, channels_sentence_path( @channel.slug,
@sentece.slug
)

aunque yo no pueda usar esto:
link_to @sentence.name, channels_sentence_path( @channel, @sentece )

el controller:
@channel = Channel.find_by_slug(params[:cannel_id])
@sentence = Sentence.find_by_slug(params[:id])

(Todo esto escrito al aire)

Queda un poco raro… me gustaría saber como lo hacéis vosotros… o
algún link o algo que explique algún modo de resolver esto de manera
un poco elegante.

Gracias.

f.


Fernando Guillén
Desarrollador Web Freelance

El día 29 de septiembre de 2008 14:39, Manuel González Noriega
[email protected]
escribió:> :slight_smile:

:?

Yo suelo dejar las rutas tal cual y genero el ID legible en #to_param.

Si el url-ID empieza por el ID de base de datos (“23-algo”) todo va
igual porque sabes que #find hace un #to_i del argumento y se queda
con el 23. Si no, el controlador sabe que debe llamar a un cierto
finder, por ejemplo:

current_user.posts.find_by_url_id(params[:id])

El día 29 de septiembre de 2008 15:19, Xavier N. [email protected]
escribió:> Yo suelo dejar las rutas tal cual y genero el ID legible en #to_param.

Genial… no conocía que la magia del model_path( @instance ) venía del
@instance.to_param… gracias

Si el url-ID empieza por el ID de base de datos (“23-algo”) todo va
igual porque sabes que #find hace un #to_i del argumento y se queda
con el 23.

Genial otra vez:

“23-algo”.to_i
=> 23

Si no, el controlador sabe que debe llamar a un cierto
finder, por ejemplo:

current_user.posts.find_by_url_id(params[:id])

Sip… tendré que hacer algo de esto también.

Gracias.
f.

Queda un poco raro… me gustaría saber como lo hacéis vosotros… o
algún link o algo que explique algún modo de resolver esto de manera
un poco elegante.

Podés probar un plugin que hace eso automágicamente: friendly_id.

Si preferís hacerlo escribiendo tu método to_param, hace poco DHH
agregó Inflector#parameterize que es básicamente lo que uno siempre
termina haciendo en to_param:

Saludos

2008/9/29 Adrián Mugnolo [email protected]:

Queda un poco raro… me gustaría saber como lo hacéis vosotros… o
algún link o algo que explique algún modo de resolver esto de manera
un poco elegante.

Podés probar un plugin que hace eso automágicamente: friendly_id.

Yo te recomiendo sluggable_finder:

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


Jaime I.
http://jaimeiniesta.com
http://www.workingwithrails.com/person/6722-jaime-iniesta

2008/9/29 Adrián Mugnolo [email protected]:

Added Inflector#parameterize for easy slug generation ("Donald E. Knu… · rails/rails@90366a1 · GitHub
Yep, el unico problema potencial es que se cepilla caracteres
acentuados y (para mi gusto) no queda fino que la URL resulte
“17-ngel-lpez”. Me parece que algunos plugins tratan esto.

El día 29 de septiembre de 2008 16:19, Adrián Mugnolo
[email protected]
escribió:>> Queda un poco raro… me gustaría saber como lo hacéis vosotros… o

algún link o algo que explique algún modo de resolver esto de manera
un poco elegante.

Podés probar un plugin que hace eso automágicamente: friendly_id.

Estudiándolo.

Si preferís hacerlo escribiendo tu método to_param, hace poco DHH
agregó Inflector#parameterize que es básicamente lo que uno siempre
termina haciendo en to_param:

Added Inflector#parameterize for easy slug generation ("Donald E. Knu… · rails/rails@90366a1 · GitHub

Esto es lo que comenta Xavier… no?

Gracias.
f.

Sí, friendly_id también resuelve eso.

Sólo comentaba que, al haber introducido Inflector#parameterize ya hay
una implementación “oficial” en el framework que se puede sobrecargar,
en el mismo sentido que los últimos agregados de i18n a Rails.

El día 29 de septiembre de 2008 16:32, Xavier N. [email protected]
escribió:> 2008/9/29 Adrián Mugnolo [email protected]:

Yep, el unico problema potencial es que se cepilla caracteres
acentuados y (para mi gusto) no queda fino que la URL resulte
“17-ngel-lpez”. Me parece que algunos plugins tratan esto.

A mi me mola este:

Saludos.
f.

El día 29 de septiembre de 2008 16:24, Jaime I.
[email protected]
escribió:> 2008/9/29 Adrián Mugnolo [email protected]:

Queda un poco raro… me gustaría saber como lo hacéis vosotros… o
algún link o algo que explique algún modo de resolver esto de manera
un poco elegante.

Podés probar un plugin que hace eso automágicamente: friendly_id.

Yo te recomiendo sluggable_finder:

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

Estudiando también… harto de reinventar la rueda… justo acabo de
hacer un minipluggin que hace el 10% de este otro.

:confused:

2008/9/29 Xavier N. [email protected]

acentuados y (para mi gusto) no queda fino que la URL resulte
“17-ngel-lpez”. Me parece que algunos plugins tratan esto.

La ultima implementacion
http://github.com/rails/rails/commit/a4f2ba8fb3c46ef9f7e31725849efdcb1a22c72des
algo más completa y potente.

Sí, con eso ya debería estar bien para el castellano.

2008/9/29 Aitor Garcia R. [email protected]:

La ultima
implementacion Modified ActiveSupport::Inflector#parameterize with code from slugali… · rails/rails@a4f2ba8 · GitHub
es algo más completa y potente.

Ah, mucho mejor.

Aun queda algun gotcha mas, por ejemplo se pierde la ß… pero para
castellano creo que anda bien.