Ruby on Rails: маршрутизация для древовидной иерархии мест - PullRequest
3 голосов
/ 03 декабря 2009

Итак, у нас есть устаревшая система, которая отслеживает места с идентификаторами, такими как «Европа / Франция / Париж», и я строю фасад Rails, чтобы превратить это в URL-адреса, такие как http: // foobar / place / Europe / France /Париж. Это требование не подлежит обсуждению, количество возможных уровней не ограничено, и мы не можем избежать косой черты.

Настройка маршрутов .rb для http://foobar/places/Europe тривиальна:

map.resources :places

... но http: // foobar / place / Europe / France жалуется: «Европа не ответила ни на что». Я попробовал:

map.connect '/places/:id', :controller => 'places', :action => 'show' 

... но это дает тот же результат, что и: id заканчивается на первом '/'. Как сделать так, чтобы удостоверение личности покрывало все и вся после «мест»?

Ответы [ 2 ]

6 голосов
/ 03 декабря 2009

Посмотрите руководство по маршрутизации для полной документации:

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" (вам, вероятно, придется заново вставить начальный слеш вручную.

Это должно помочь вам.

0 голосов
/ 04 декабря 2009

Я немного подправил ответ Коди, чтобы придумать:

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 и т. Д.

Теперь 2-я строка должна работать, но не работает благодаря вышеприведенной ошибке, поэтому вот обходной путь для place_controller.rb, который вручную разбивает идентификатор и устанавливает формат, по умолчанию XML:

id, suffix = params[:id].join('/').split('.') 
params[:format] = suffix ? suffix : "xml"
...