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
http://www.fernandoguillen.info

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:

http://github.com/rails/rails/commit/90366a1521659d07a3b75936b3231adeb376f1a4

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]:

http://github.com/rails/rails/commit/90366a1521659d07a3b75936b3231adeb376f1a4
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:

http://github.com/rails/rails/commit/90366a1521659d07a3b75936b3231adeb376f1a4

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:
http://github.com/ludo/to_slug/tree/master

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 http://github.com/rails/rails/commit/a4f2ba8fb3c46ef9f7e31725849efdcb1a22c72d
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.