资源不应该被嵌套超过10级深。参考:http://weblog.jamisbuck.org/2007/2/5/nesting-resources
如果你真的需要那种深度,那么你可以用浅属性设置为true来解决这个问题。 参考:http://edgeguides.rubyonrails.org/routing.html#shallow-nesting
更新为更好地解释利用浅层嵌套
rails new shallow-routes
cd shallow-routes
编辑config/routes.rb
添加你想要的路线
resources :continent do
resources :countries do
resource :cities do
resource :streets
end
end
end
现在正在运行rake routes
,我们有这样的:
Prefix Verb URI Pattern Controller#Action
continent_country_cities_streets POST /continent/:continent_id/countries/:country_id/cities/streets(.:format) streets#create
new_continent_country_cities_streets GET /continent/:continent_id/countries/:country_id/cities/streets/new(.:format) streets#new
edit_continent_country_cities_streets GET /continent/:continent_id/countries/:country_id/cities/streets/edit(.:format) streets#edit
GET /continent/:continent_id/countries/:country_id/cities/streets(.:format) streets#show
PATCH /continent/:continent_id/countries/:country_id/cities/streets(.:format) streets#update
PUT /continent/:continent_id/countries/:country_id/cities/streets(.:format) streets#update
DELETE /continent/:continent_id/countries/:country_id/cities/streets(.:format) streets#destroy
continent_country_cities POST /continent/:continent_id/countries/:country_id/cities(.:format) cities#create
new_continent_country_cities GET /continent/:continent_id/countries/:country_id/cities/new(.:format) cities#new
edit_continent_country_cities GET /continent/:continent_id/countries/:country_id/cities/edit(.:format) cities#edit
GET /continent/:continent_id/countries/:country_id/cities(.:format) cities#show
PATCH /continent/:continent_id/countries/:country_id/cities(.:format) cities#update
PUT /continent/:continent_id/countries/:country_id/cities(.:format) cities#update
DELETE /continent/:continent_id/countries/:country_id/cities(.:format) cities#destroy
continent_countries GET /continent/:continent_id/countries(.:format) countries#index
POST /continent/:continent_id/countries(.:format) countries#create
new_continent_country GET /continent/:continent_id/countries/new(.:format) countries#new
edit_continent_country GET /continent/:continent_id/countries/:id/edit(.:format) countries#edit
continent_country GET /continent/:continent_id/countries/:id(.:format) countries#show
PATCH /continent/:continent_id/countries/:id(.:format) countries#update
PUT /continent/:continent_id/countries/:id(.:format) countries#update
DELETE /continent/:continent_id/countries/:id(.:format) countries#destroy
continent_index GET /continent(.:format) continent#index
POST /continent(.:format) continent#create
new_continent GET /continent/new(.:format) continent#new
edit_continent GET /continent/:id/edit(.:format) continent#edit
continent GET /continent/:id(.:format) continent#show
PATCH /continent/:id(.:format) continent#update
PUT /continent/:id(.:format) continent#update
DELETE /continent/:id(.:format) continent#destroy
让我们改变资源为浅筑巢,并期待在结果
resources :continent, shallow: true do
resources :countries do
resource :cities do
resource :streets
end
end
end
它的结果
Prefix Verb URI Pattern Controller#Action
country_cities_streets POST /countries/:country_id/cities/streets(.:format) streets#create
new_country_cities_streets GET /countries/:country_id/cities/streets/new(.:format) streets#new
edit_country_cities_streets GET /countries/:country_id/cities/streets/edit(.:format) streets#edit
GET /countries/:country_id/cities/streets(.:format) streets#show
PATCH /countries/:country_id/cities/streets(.:format) streets#update
PUT /countries/:country_id/cities/streets(.:format) streets#update
DELETE /countries/:country_id/cities/streets(.:format) streets#destroy
country_cities POST /countries/:country_id/cities(.:format) cities#create
new_country_cities GET /countries/:country_id/cities/new(.:format) cities#new
edit_country_cities GET /countries/:country_id/cities/edit(.:format) cities#edit
GET /countries/:country_id/cities(.:format) cities#show
PATCH /countries/:country_id/cities(.:format) cities#update
PUT /countries/:country_id/cities(.:format) cities#update
DELETE /countries/:country_id/cities(.:format) cities#destroy
continent_countries GET /continent/:continent_id/countries(.:format) countries#index
POST /continent/:continent_id/countries(.:format) countries#create
new_continent_country GET /continent/:continent_id/countries/new(.:format) countries#new
edit_country GET /countries/:id/edit(.:format) countries#edit
country GET /countries/:id(.:format) countries#show
PATCH /countries/:id(.:format) countries#update
PUT /countries/:id(.:format) countries#update
DELETE /countries/:id(.:format) countries#destroy
continent_index GET /continent(.:format) continent#index
POST /continent(.:format) continent#create
new_continent GET /continent/new(.:format) continent#new
edit_continent GET /continent/:id/edit(.:format) continent#edit
continent GET /continent/:id(.:format) continent#show
PATCH /continent/:id(.:format) continent#update
PUT /continent/:id(.:format) continent#update
DELETE /continent/:id(.:format) continent#destroy
它的图像对更好的视野差异http://i.imgur.com/21CEM7j.png
我们这里又是什么路线比较简单,像/continent/:continent_id/countries
这样的路线现在只存在于索引,创建和新的其他都在大陆范围之外在路线
请注意,这是真正有用的,因为你并不需要的路线告诉你,一个街道是一个大陆内部,这是显而易见的,如果你的街是一个城市里面,这是当然的国境内还有大陆。
直接的答案 - 现在让我们来看看你的目标在这里
/大洲/:continent_id /国家/城市
您希望大陆的所有城市,为什么[在地狱,对不起]你需要他们之间的国家吗?
我只是做/continents/:id/cities
,简单得多,很容易理解。
为了实现您刚才创建大洲内一个新的路由资源
resources :continent, shallow: true do
member do
get 'cities'
end
resources :countries do
resource :cities do
resource :streets
end
end
end
,然后你有这个新的漂亮的路线
cities_continent GET /continent/:id/cities(.:format) continent#cities
浅筑巢我会怎么做我想要的功能 – srmeile
@ user3839189检查我的这个答案 –
的更新谢谢你的伟大的解释@Ramon马克斯 – srmeile