Rails 4 et 5
Dans Rails 4, l' :param
option a été ajoutée, qui semble faire exactement ce que vous recherchez. Vous pouvez jeter un oeil au code Rails 3 par rapport au code Rails 4 .
Détails
Vous pouvez facilement l'implémenter dans votre routes.rb
fichier:
# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
Depuis la sortie de Rails 4, cette fonctionnalité est documentée dans les guides Rails .
Rails 3
Malheureusement, dans Rails 3, l' :key
option pour a resources
été supprimée, vous ne pouvez donc plus changer facilement le nom des routes créées de cette manière en passant simplement une option supplémentaire.
Détails
Je suppose que vous avez déjà fait fonctionner l'application comme vous le souhaitez au cours de la dernière année, mais je vais trouver un moyen d'obtenir l'effet que vous décrivez dans Rails 3 routes.rb
. Cela impliquera juste un peu plus de travail que la to_param
méthode. Vous pouvez toujours définir des paramètres personnalisés dans des itinéraires définis à l' aide scope
et match
(ou cousins de elle get
, put
, post
et delete
). Il vous suffit d'écrire le nom du paramètre souhaité dans le matcher:
get 'clients/:client_name', :to => 'clients#show', :as => client
scope 'clients/:client_name' do
get 'sites/:name', :to => 'sites#show', :as => site
end
Vous devrez ajouter manuellement tous les itinéraires créés resources
automatiquement pour vous, mais cela permettrait d'obtenir ce que vous recherchez. Vous pouvez également utiliser efficacement l' :controller
option avec scope
et des scope
blocs supplémentaires pour supprimer une partie de la répétition.
EDIT (8 mai 2014): Rendez plus évident la réponse contient des informations pour les deux Rails 3 et 4. Mettez à jour les liens vers le code pour aller aux numéros de ligne et commits exacts afin qu'ils fonctionnent pendant une période plus longue.
EDIT (16 novembre 2014): Rails 4 devrait être au sommet maintenant et inclure des informations pertinentes car il s'agit de la version actuelle de Rails depuis un certain temps maintenant.
EDIT (9 août 2016): pensez que la solution fonctionne toujours dans Rails 5 et mettez à jour les liens obsolètes.