Мелкая маршрутизация в Rails 3 - PullRequest
3 голосов
/ 17 сентября 2011

С трудом проводя время с моими маршрутами в приложении 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 Ответ

12 голосов
/ 29 сентября 2011

То, что вы ищете, обычно не называется «мелкой маршрутизацией».

Мелкая маршрутизация, как определяет ее 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

Малая маршрутизация позволяет вам вкладывать ресурс под другим ресурсом (в данном случае это район города), но дает вам абсолютные / не вложенные маршруты для вложенного ресурса, когда вложение не требуется.

Это имеет смысл, когда вы ссылаетесь на вложенный ресурс с уникальными идентификаторами, которые не зависят от идентификатора родительского ресурса. В вашем примере это , а не true (за пределами Сан-Франциско потенциально может быть «Юнион-сквер»; определенно будут дубликаты, такие как «Китайский квартал»), так что вы, вероятно, не хотите мелкие маршруты для этого случая.

То, что вам нужно, это позиционно-зависимая маршрутизация, где тип ресурса предполагается / фиксируется в зависимости от того, где он появляется в URL. (Например, у вас не может быть ничего, кроме «соседства», следующего за «городом» по схеме, которую вы обрисовали.)

Я не думаю, что команды Rails resource(s) будут поддерживать это по умолчанию, но вы, вероятно, могли бы сделать это с помощью ручных match команд. Это с моей головы:

match ":city_id", :controller => "cities", :action => "show"
match ":city_id/:neighborhood_id", :controller => "neighborhoods", :action => "show"

Это все еще RESTful / основанный на ресурсах, он просто не использует стандартный способ именования маршрутов Rails.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...