Ruby on Rails: Routing per una gerarchia ad albero di posti
-
11-09-2019 - |
Domanda
Quindi abbiamo un sistema legacy che tiene traccia luoghi con ID come "Europa / Francia / Parigi", e sto costruendo una facciata Rails di trasformare questo in URL del tipo http: // foobar / luoghi / Europa / Francia /Parigi. Questo requisito non è negoziabile, il numero dei possibili livelli senza limiti, e non possiamo sfuggire alle barre.
Impostazione routes.rb per http: // foobar / luoghi / Europa è banale:
map.resources :places
... ma http: // foobar / luoghi / Europa / Francia lamenta "Nessuna azione risposto a l'Europa". Ho provato:
map.connect '/places/:id', :controller => 'places', :action => 'show'
... ma questo dà lo stesso risultato, come a quanto pare il: id termina al primo '/'. Come faccio a fare l'ID coprire tutto e di più dopo che i "luoghi"?
Soluzione
Dai un'occhiata alla guida di instradamento per la documentazione completa:
http://guides.rubyonrails.org/routing.html
In particolare la sezione "4.9 percorso globbing".
Ma penso che ciò che si vuole veramente fare è dichiarare il vostro percorso come:
map.connect '/places/*id', :controller => 'places', :action => 'index'
Chiamato con un URL del tipo
/places/foo/bar/1
Yields a params[:id] => ["foo", "bar", "1"]
Il che si potrebbe facilmente (ri) si uniscono con "/" per ottenere la stringa completa che vuoi "foo / bar / 1" (probabilmente si dovrà reinserire lo slash iniziale manualmente.
Questo dovrebbe farti andare.
Altri suggerimenti
ho ottimizzato la risposta di Cody sopra un po 'a venire con questo:
map.place '/places/*id', :controller => 'places', :action => 'show'
map.connect '/places/*id.:format', :controller => 'places', :action => 'show'
Utilizzando map.place invece di map.connect, Rails sa quello delle risorse abbiamo a che fare e ha generato place_url
, place_path
ecc aiutanti correttamente.
Ora, la seconda linea di dovrebbe di lavoro, ma non grazie al bug di cui sopra, quindi ecco una soluzione per places_controller.rb che divide manualmente l'ID e imposta il formato, inadempiente a XML:
id, suffix = params[:id].join('/').split('.')
params[:format] = suffix ? suffix : "xml"