Carriles 4 y 5
En Rails 4, :param
se 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.rb
archivo:
# 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 :key
opció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_param
método. Todavía se puede definir parámetros personalizados en rutas definidas usando scope
y 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 resources
crea automáticamente para usted, pero lograría lo que está buscando. También puede utilizar eficazmente la :controller
opción con bloques scope
adicionales scope
para 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.
param
opción para rieles 3: gist.github.com/sj26/44ef47fe8b98b46ee32dpost_slug
, lo que puede resultar confuso.en Rails 4, pase la opción param para cambiar: id params. Por ejemplo
resources :photos, param: :photo_name
, generará / photos /: photo_namefuente
Si te entiendo bien, lo que quieres es tener el en
client_name
lugar deid
en tu url, ¿verdad?Puede hacerlo anulando el
to_param
método en su modelo. Puede obtener más información aquí .fuente
Hay una joya para eso, al igual que hay una joya para todo;)
He estado usando FriendlyId para este tipo de comportamiento en rieles 3.
Sin embargo, requerirá que agregue algún código a su modelo, como este:
... y si sus clientes no tienen nombres compatibles con URI, es posible que desee usar un slug para eso, lo que puede hacer
has_friendly_id :name, :use_slug => true
. Sin embargo, cuando use slugs, obviamente también deberá conservarlos en la base de datos.Y como ya se mencionó, aún puede usar el
to_param
truco con rieles 3, como se documenta aquí . Sin embargo, encuentro FriendlyId un poco más versátil.fuente
to_param
, pero también hace algunas otras cosas inteligentes en segundo plano. Encontré el enlace aquí: stackoverflow.com/questions/4744446/…to_param
rompe mi parte frontal de la aplicación. En realidad, estoy buscando desesperadamente el enfoque de enrutamiento si tengo que cambiar mi API pero sin romper la parte Modelo y Frontend de la aplicación. ¿Por qué no puedo tener el enfoque de modificar las rutas solo como dije y la publicación de ejemplo para la versión anterior de rieles anterior?@client = Client.find(:name => param[:client_name]
enClientsController#show
? Aquello podría funcionar.Client.where(:name => param[:client_name]).first
, es decir.En Rails 3 puedes cambiar el nombre de las claves de identificación usando una combinación de espacios de nombres y ámbitos como esta (aunque no muy agradable):
fuente