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.
param
option pour les rails 3: gist.github.com/sj26/44ef47fe8b98b46ee32dpost_slug
, ce qui peut prêter à confusion.dans Rails 4, passez l'option param pour modifier les paramètres: id. Par exemple
resources :photos, param: :photo_name
va générer / photos /: photo_namela source
Si je vous comprends bien, ce que vous voulez, c'est avoir la
client_name
place deid
dans votre URL, non?Vous pouvez le faire en remplaçant la
to_param
méthode dans votre modèle. Vous pouvez obtenir plus d'informations ici .la source
Il y a un bijou pour ça, tout comme il y a un bijou pour tout;)
J'utilise FriendlyId pour ce genre de comportement dans les rails 3.
Il vous faudra cependant ajouter du code à votre modèle, comme ceci:
... et si vos clients n'ont pas de noms compatibles URI, vous pouvez utiliser un slug pour cela, ce que vous pouvez faire
has_friendly_id :name, :use_slug => true
. Lorsque vous utilisez des slugs, vous devrez évidemment les conserver dans la base de données.Et comme déjà mentionné, vous pouvez toujours utiliser l'
to_param
astuce avec les rails 3, comme documenté ici . Je trouve cependant FriendlyId un peu plus polyvalent.la source
to_param
, mais il fait également d'autres choses intelligentes en arrière-plan. J'ai trouvé le lien ici: stackoverflow.com/questions/4744446/…to_param
brise ma partie frontale de l'application. En fait, je cherche désespérément l'approche de routage, c'est que je dois changer mon API mais sans casser la partie modèle et frontend de l'application. Pourquoi ne puis-je pas simplement avoir l'approche de modifier les itinéraires uniquement comme je l'ai indiqué et l'exemple de poste pour l'ancienne version des rails ci-dessus ???@client = Client.find(:name => param[:client_name]
dansClientsController#show
? Cela pourrait marcher.Client.where(:name => param[:client_name]).first
, C'est.Dans Rails 3, vous pouvez renommer les clés d'identifiant en utilisant une combinaison d'espaces de noms et d'étendues comme celle-ci (pas très bien cependant):
la source