Ruby on Rails: Encaminhamento para uma hierarquia de árvore de lugares
-
11-09-2019 - |
Pergunta
Então, nós temos um sistema legado que rastreia lugares com IDs como "Europa / França / Paris", e eu estou construindo um Rails fachada de transformar isso em URLs como http: // foobar / lugares / Europa / França /Paris. Esta exigência não é negociável, o número de possíveis níveis ilimitados, e não podemos escapar das barras.
Configuração routes.rb para http: // foobar / lugares / Europa é trivial:
map.resources :places
... mas http: // foobar / lugares / Europa / França reclama "Nenhuma ação respondeu a Europa". Eu tentei:
map.connect '/places/:id', :controller => 'places', :action => 'show'
... mas isso dá o mesmo resultado, como aparentemente o: extremidades id no primeiro '/'. Como posso fazer a qualquer coisa cover ID e tudo depois os "lugares"?
Solução
Tenha um olhar na guia de encaminhamento para documentação completa:
http://guides.rubyonrails.org/routing.html
Especificamente seção "4.9 Route englobamento".
Mas eu acho que o que você realmente quer fazer é declarar o seu percurso como:
map.connect '/places/*id', :controller => 'places', :action => 'index'
Chamado com uma URL como
/places/foo/bar/1
Yields a params[:id] => ["foo", "bar", "1"]
O que você poderia facilmente (re) unir-se com "/" para produzir a cadeia completa você quer "foo / bar / 1" (você provavelmente terá de re-inserção da barra inicial manualmente.
Isso deve você ir.
Outras dicas
Eu mexido resposta de Cody acima ligeiramente para chegar a esta:
map.place '/places/*id', :controller => 'places', :action => 'show'
map.connect '/places/*id.:format', :controller => 'places', :action => 'show'
Ao usar map.place vez de map.connect, Rails sabe o recurso que estamos lidando com e place_url
gerado, place_path
etc ajudantes corretamente.
Agora, a segunda linha deve trabalho, mas não graças ao bug acima, então aqui está uma solução alternativa para places_controller.rb que manualmente divide o ID e define o formato, falta para XML:
id, suffix = params[:id].join('/').split('.')
params[:format] = suffix ? suffix : "xml"