Carriles 4 y 5
En Rails 4, :paramse agregó la opción, que parece hacer exactamente lo que estás buscando. Puede echar un vistazo al código de Rails 3 en comparación con el código de Rails 4 .
Detalles
Puede implementar esto fácilmente en su routes.rbarchivo:
# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
A partir del lanzamiento de Rails 4, esta funcionalidad está documentada en las Guías de Rails .
Carriles 3
Desafortunadamente, en Rails 3, se eliminó la :keyopción para resources, por lo que ya no puede cambiar fácilmente el nombre de las rutas creadas de esta manera simplemente pasando una opción adicional.
Detalles
Supongo que de alguna manera ya consiguió que la aplicación funcionara de la manera que deseaba el año pasado, pero buscaré la manera de obtener el efecto que describe en Rails 3 en routes.rb. Solo implicará un poco más de trabajo que el to_parammétodo. Todavía se puede definir parámetros personalizados en rutas definidas usando scopey match(o no lo tenga primos get, put, post, y delete). Simplemente escriba el nombre del parámetro que desea en el comparador:
get 'clients/:client_name', :to => 'clients#show', :as => client
scope 'clients/:client_name' do
get 'sites/:name', :to => 'sites#show', :as => site
end
Tendría que agregar manualmente todas las rutas que resourcescrea automáticamente para usted, pero lograría lo que está buscando. También puede utilizar eficazmente la :controlleropción con bloques scopeadicionales scopepara eliminar parte de la repetición.
EDITAR (8 de mayo de 2014): Haga que sea más obvio que la respuesta contiene información para ambos Rails 3 y 4. Actualice los enlaces al código para ir a los números de línea exactos y confirmaciones para que funcionen por un período de tiempo más largo.
EDITAR (16 de noviembre de 2014): Rails 4 debería estar en la parte superior ahora e incluir información relevante, ya que ha sido la versión actual de Rails desde hace bastante tiempo.
EDITAR (9 de agosto de 2016): refleje que la solución todavía funciona en Rails 5 y actualice los enlaces obsoletos.