То, что вы ищете, обычно не называется «мелкой маршрутизацией».
Мелкая маршрутизация, как определяет ее 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.