Мелкая маршрутизация в 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.

Другие вопросы по тегам