資源不應該被嵌套超過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