2017-07-07 99 views
2

的指标,我有以下途径Rails的深度嵌套与父母

resources :continent do 
    resources :countries do 
     resource :cities do 
      resource :streets 
     end 
    end 
    end 

要选择一个国家,我会做

/continents/:continent_id/countries/:country_id 

等。

我的问题是如何获得特定国家或大陆的所有街道。或一个特定大陆的所有国家。

例如有没有办法做到

/continents/:continent_id/countries/cities 

将返回在所有城市:continent_id

回答

3

资源不应该被嵌套超过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 
+0

浅筑巢我会怎么做我想要的功能 – srmeile

+1

@ user3839189检查我的这个答案 –

+0

的更新谢谢你的伟大的解释@Ramon马克斯 – srmeile

1

您可以使用下面的模型关系

class Country < ActiveRecord::Base 
    has_many :streets, :through => : cities 
end 

所以,你可以使用例如代码

Country.find(1).streets