Мелкая маршрутизация в Rails 3
Находясь в приложении rails 3 с трудными временами, я хочу иметь такие мелкие маршруты:
/san-francisco/union-square
Но мой роутер настаивает на том, чтобы они были такими:
/cities/san-francisco/neighborhoods/union-square
Я использовал это для моего routes.rb
shallow do
resources :cities do
resources :neighborhoods do
resources :locations
end
end
end
Но все же у меня есть это:
city_neighborhood_locations GET /cities/:city_id/neighborhoods/:neighborhood_id/locations(.:format)
Не должно ли это выглядеть так:
city_neighborhood_locations GET /:city_id/:neighborhood_id/:id(.:format)
Я не уверен, как это исправить, кроме того, я не уверен, что я делаю неправильно со своими ссылками, я хочу иметь возможность использовать синтаксис:
link_to neighborhood.name, [:city, neighborhood]
но это, кажется, инвертировать :id
, а также :neighborhood_id
когда запрос приходит к контроллеру, любая помощь по этому вопросу будет действительно очень полезной!
1 ответ
То, что вы ищете, обычно не называется "мелкой маршрутизацией".
Мелкая маршрутизация, как определяет ее Rails, будет выглядеть так:
city_neighborhoods GET /cities/:city_id/neighborhoods
new_city_neighborhood GET /cities/:city_id/neighborhoods/new
(create_city_neighborhood) POST /cities/:city_id/neighborhoods
neighborhood GET /neighborhoods/:neighborhood_id
Без мелкой маршрутизации этот последний маршрут будет:
city_neighborhood GET /cities/:city_id/neighborhoods/:neighborhood_id
Неглубокая маршрутизация позволяет вам вкладывать ресурс под другим ресурсом (в данном случае это район города), но дает вам абсолютные / не вложенные маршруты для вложенного ресурса, когда вложение не требуется.
Это имеет смысл, когда вы ссылаетесь на вложенный ресурс с уникальными идентификаторами, которые не зависят от идентификатора родительского ресурса. В вашем примере это не так (потенциально существует "Юнион-сквер" за пределами Сан-Франциско; там наверняка будут дубликаты, такие как "Китайский квартал"), так что вы, вероятно, не хотите использовать неглубокие маршруты для этого случая.
То, что вам нужно, это позиционно-зависимая маршрутизация, где тип ресурса предполагается / фиксируется в зависимости от того, где он появляется в URL. (Например, у вас не может быть ничего, кроме "соседства", следующего за "городом" по схеме, которую вы обрисовали.)
Я не думаю, что рельсы resource(s)
команды будут поддерживать это по умолчанию, но вы можете сделать это вручную match
команды. Это с моей головы:
match ":city_id", :controller => "cities", :action => "show"
match ":city_id/:neighborhood_id", :controller => "neighborhoods", :action => "show"
Это все еще RESTful/ основанный на ресурсах, он просто не использует стандартный способ именования маршрутов Rails.