Rutas REST sin ID

¿Sabéis si hay alguna forma de crear rutas REST pero que en vez de hacer
la selección por id la hagan por un campo de texto llamado permalink? Sé
hacerlo concatenando el id y el permalink, de forma que el id es lo
único que se tiene en cuenta y el permalink es descartado:
/mensajes/123-titulo-del-mensaje

pero para el tipo, no queda bien
/tipos/5-restaurantes
/tipos/5-restaurantes/mensajes/123-titulo-del-mensaje

Y quiero que sea
/tipos/restaurantes
/tipos/restaurantes/mensajes/123-titulo-del-mensaje

¿Hay alguna forma de hacerlo dentro del REST, o tendré que declararme
mis propias rutas?

Nota: los tipos son pocos y los mete el administrador, por lo que no
habrá problemas de colisión de permalinks; en los mensajes, dejando el
id me ahorro tener que gestionar posibles permalinks repetidos.

Yo lo tengo así:

En el modelo:

def to_param
“#{permalink}”
end

En el controlador, tienes que cambiar los find(params[:id]) por
find_by_permalink(params[:id])

No se si hay alguna forma mejor de hacerlo, pero así funciona…:smiley:

2008/2/28 Fernando C. [email protected]:

Yo añadiria que la accion show retorne un 404 si no se encuentra el
item.

Si hacemos esto …

posts_controller.rb

def show
@post = Post.find(params[:id])
end

… y nos pasan un id inexistente rails devuelve un 404. Pero al
hacer …

posts_controller.rb

def show
@post = Post.find_by_permalink(params[:id)
end

… rails devuelve un error 500. Para arreglarlo debes tirar una
excepción cuando no se encuentra el item.

posts_controller.rb

def show
Post.find_by_slug(params[:id]) or raise
ActiveRecord::RecordNotFound
end

Un saludo,

Francesc

On Feb 28, 2008, at 3:00 PM, [dac] wrote:

No se si hay alguna forma mejor de hacerlo, pero así funciona…:smiley:
/tipos/5-restaurantes
habrá problemas de colisión de permalinks; en los mensajes, dejando el

Daniel A. Castro
[email protected] | skype: dac.ocio
http://www.e-dac.es | http://www.dosmiluno.org


Ror-es mailing list
[email protected]
simplelogica.net


Not sent from my iPhone

Miguel Michelson wrote:

Hola, te recomiendo este plugin

http://www.estadobeta.com/?p=249&c=1

es muy bueno y es compatible con rest, y no tienes que cambiar la
estructura
de tus finds
una vez que guardas el registro a la base de datos se crea un campo slug
o
como quieras llamarlo formateado para tus permalinks, por ejemplo
defines
que tu el campo title de tu modelo posts sea el referente del permalink,
entonces

  1. class Post < ActiveRecord::Base
  2. sluggable_finder :title
  3. end

lo bueno es que no tienes que cambiar ni un pelo los finds de tus
controllers, puedes seguir utilizando findById y te reconoce el slug,
pruebalo y me cuentas que tal, yo lo uso en todos mis proyectos 100%
recomendable, ademas tiene soporte para las ñ y caracteres latinos

Saludos

2008/2/28 Francesc E. [email protected]:

Muchas gracias a todos!! Ambas soluciones parecen muy buenas, voy a
probar el plugin pero lo otro también parece muy bueno.

s2

Hola Fernando, no se si esto te sirva, pero tal vez puedes hacer un
‘find_by_name’ en vez de un fin comun y corriente; para manejar los
registros que no existen, en el caso que ingresen un mal nombre, yo uso
esto:

class MiController < ApplicationController
rescue_from(ActiveRecord::RecordNotFound) do |exception|
render :template => ‘shared/record_not_found.html.erb’
end

Saludos.

El día 28/02/08, Fernando C. [email protected]
escribió:

Hola, te recomiendo este plugin

http://www.estadobeta.com/?p=249&c=1

es muy bueno y es compatible con rest, y no tienes que cambiar la
estructura
de tus finds
una vez que guardas el registro a la base de datos se crea un campo slug
o
como quieras llamarlo formateado para tus permalinks, por ejemplo
defines
que tu el campo title de tu modelo posts sea el referente del permalink,
entonces

  1. class Post < ActiveRecord::Base
  2. sluggable_finder :title
  3. end

lo bueno es que no tienes que cambiar ni un pelo los finds de tus
controllers, puedes seguir utilizando findById y te reconoce el slug,
pruebalo y me cuentas que tal, yo lo uso en todos mis proyectos 100%
recomendable, ademas tiene soporte para las ñ y caracteres latinos

Saludos

2008/2/28 Francesc E. [email protected]: