Ruby on Rails: Routing für eine Baumhierarchie der Plätze
-
11-09-2019 - |
Frage
So haben wir ein Legacy-System bekommen, die Orte mit IDs wie „Europa / Frankreich / Paris“ verfolgt, und ich baue eine Rails Fassade dies in URLs wie http zu drehen: // foobar / places / Europa / Frankreich /Paris. Diese Forderung ist nicht verhandelbar, die Anzahl der möglichen Ebenen in unbegrenzt, und wir können die Schrägstriche nicht entziehen.
Einrichten routes.rb für http: // foobar / places / Europa trivial ist:
map.resources :places
... aber http: // foobar / places / Europa / Frankreich beklagt "Keine Aktion nach Europa reagiert". Ich habe versucht:
map.connect '/places/:id', :controller => 'places', :action => 'show'
... aber das gibt das gleiche Ergebnis, wie offenbar die: id an dem ersten ‚/‘ endet. Wie mache ich die ID deckt alles und alles nach dem „Ort“?
Lösung
Haben Sie einen Blick auf die Routing-Handbuch für eine vollständige Dokumentation:
http://guides.rubyonrails.org/routing.html
Im einzelnen Abschnitt "4.9 Strecke Platzhalter".
Aber ich denke, was Sie wirklich tun möchte, ist die Route erklären wie:
map.connect '/places/*id', :controller => 'places', :action => 'index'
Wird aufgerufen, mit einer URL wie
/places/foo/bar/1
Yields a params[:id] => ["foo", "bar", "1"]
Was könnte man leicht (wieder) kommen mit „/“ die vollständige Zeichenfolge erhalten Sie „foo / bar / 1“ wollen (Sie wahrscheinlich den führenden Schrägstrich manuell wieder einsetzen müssen.
Das sollte erhalten Sie gehen.
Andere Tipps
gezwickt I Codys Antwort oben leicht mit diesem zu kommen:
map.place '/places/*id', :controller => 'places', :action => 'show'
map.connect '/places/*id.:format', :controller => 'places', :action => 'show'
Durch die Verwendung von map.place statt map.connect, Rails weiß, was Ressource wir es zu tun haben und erzeugt place_url
, place_path
etc Helfer richtig.
Nun wird die zweite Zeile sollte Arbeit, aber nicht durch den Fehler oben, so ist hier eine Abhilfe für places_controller.rb, die manuell die ID spaltet und setzt das Format, in XML säumigen:
id, suffix = params[:id].join('/').split('.')
params[:format] = suffix ? suffix : "xml"