Ruby on Rails: routage pour une hiérarchie d'arborescence des lieux
-
11-09-2019 - |
Question
Nous avons donc un système existant qui suit les lieux avec des ID comme « Europe / France / Paris », et je suis la construction d'une façade Rails pour la transformer en URL comme http: // foobar / lieux / Europe / France /Paris. Cette exigence est pas négociable, le nombre de niveaux possibles en illimité, et nous ne pouvons pas échapper aux barres obliques.
Mise en place routes.rb http: // foobar / lieux / Europe est trivial:
map.resources :places
... mais http: // foobar / lieux / Europe / France se plaint "Aucune action a répondu à l'Europe". J'ai essayé:
map.connect '/places/:id', :controller => 'places', :action => 'show'
... mais cela donne le même résultat, comme apparemment le: id se termine au premier « / ». Comment puis-je faire couvrir l'ID quoi que ce soit et tout après les « lieux »?
La solution
Jetez un coup d'oeil au Guide de routage pour une documentation complète:
http://guides.rubyonrails.org/routing.html
Plus précisément la section "4.9 Route englobement".
Mais je pense que ce que vous voulez vraiment faire est de déclarer votre itinéraire comme:
map.connect '/places/*id', :controller => 'places', :action => 'index'
Appelé avec une URL comme
/places/foo/bar/1
Yields a params[:id] => ["foo", "bar", "1"]
Que vous pourriez facilement (re) joindre à « / » pour obtenir la chaîne complète que vous voulez « foo / bar / 1 » (vous devrez probablement re-insérer la barre oblique manuellement.
Cela devrait aller.
Autres conseils
Je peaufiné la réponse de Cody légèrement au-dessus pour arriver à ceci:
map.place '/places/*id', :controller => 'places', :action => 'show'
map.connect '/places/*id.:format', :controller => 'places', :action => 'show'
En utilisant map.place au lieu de map.connect, Rails sait ce que les ressources que nous avons affaire et généré place_url
, aides place_path
etc correctement.
Maintenant, la 2ème ligne devrait travaux, mais pas grâce au bug ci-dessus, voici donc une solution de contournement pour places_controller.rb qui divise manuellement l'ID et définit le format, par défaut XML:
id, suffix = params[:id].join('/').split('.')
params[:format] = suffix ? suffix : "xml"