Ruby на рельсах:Маршрутизация для древовидной иерархии мест
-
11-09-2019 - |
Вопрос
Итак, у нас есть устаревшая система, которая отслеживает места с идентификаторами типа "Европа / Франция / Париж", и я создаю фасад Rails, чтобы превратить это в URL-адреса типа http: // foobar/places/Europe / France / Paris.Это требование не подлежит обсуждению, количество возможных уровней неограниченно, и мы не можем избежать косых черт.
Настройка routes.rb для http://foobar/places/Europe это тривиально:
map.resources :places
...но http:// foobar/places/Europe/ France жалуется, что "Европа не отреагировала на какие-либо действия".Я пытался:
map.connect '/places/:id', :controller => 'places', :action => 'show'
...но это дает тот же результат, поскольку, по-видимому, идентификатор : заканчивается на первом '/'.Как мне сделать так, чтобы идентификатор охватывал все и вся после "мест"?
Решение
Ознакомьтесь с Руководством по маршрутизации для получения полной документации:
http://guides.rubyonrails.org/routing.html
В частности, раздел "4.9 Изменение маршрута".
Но я думаю, что то, что вы действительно хотите сделать, это объявить свой маршрут следующим образом:
map.connect '/places/*id', :controller => 'places', :action => 'index'
Вызывается с URL-адресом типа
/places/foo/bar/1
Yields a params[:id] => ["foo", "bar", "1"]
Который вы могли бы легко (повторно) соединить с помощью "/", чтобы получить полную строку, которую вы хотите "foo /bar /1" (вероятно, вам придется повторно вставить начальную косую черту вручную.
Это должно заставить тебя двигаться дальше.
Другие советы
Я немного изменил ответ Коди выше, чтобы придумать это:
map.place '/places/*id', :controller => 'places', :action => 'show'
map.connect '/places/*id.:format', :controller => 'places', :action => 'show'
Используя map.place вместо map.connect, Rails знает, с каким ресурсом мы имеем дело, и генерирует place_url
, place_path
etc помогает правильно.
Итак, 2-я строка следует работает, но не благодаря приведенной выше ошибке, поэтому вот обходной путь для places_controller.rb, который вручную разделяет идентификатор и устанавливает формат, по умолчанию равный XML:
id, suffix = params[:id].join('/').split('.')
params[:format] = suffix ? suffix : "xml"