Ruby на рельсах:Маршрутизация для древовидной иерархии мест

StackOverflow https://stackoverflow.com/questions/1837794

Вопрос

Итак, у нас есть устаревшая система, которая отслеживает места с идентификаторами типа "Европа / Франция / Париж", и я создаю фасад 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"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top