2017-05-04 113 views
1

嵌套控制器在我routes.rb我有軌道 - 如何定位的嵌套的資源路徑

namespace :admin do 
    resources :clients do, only: [:index] do 
    resources :products, only: [:index, :new, :create] 
    end 

    resources :products, only: [:index] 
end 

請注意,我有兩行resources :products。一個嵌套在resources :clients之內,另一個作爲:admin的頂級資源;這兩個中的每一個在應用程序中都有不同的用途。

rake routes給我:

  admin_clients GET /admin/clients(.:format)       admin/clients#index 
    admin_client_products GET /admin/clients/:client_id/products(.:format)  admin/products#index 
         POST /admin/clients/:client_id/products(.:format)  admin/products#create 
new_admin_client_product GET /admin/clients/:client_id/products/new(.:format) admin/products#new 
      admin_products GET /admin/products(.:format)      admin/products#index      

我有一個admin_client_products的嵌套product#index資源。我也有頂級product#index資源admin_products。但是,他們指向相同的控制器操作:admin/product#index

問題:在這一點上,我需要導軌來推斷這是兩種不同的行爲。使用rails慣例,有沒有辦法告訴rails這兩個資源應該有不同的控制器動作,即應該打到admin/products#index而另一個應該打到admin/clients/products#index

嵌套的路線應該打這個:

class Admin::Clients::ProductsController < Admin::BaseController  
    def index; end 
end 

頂層路線應該打這個:

class Admin::ProductsController < Admin::BaseController  
    def index; end 
end 

回答

0

絕對可以!

在這裏您需要通過明確指定用於資源的控制器來自定義您的資源路由。 :controller選項會讓你這樣做。

因此,在您的情況下,指定控制器爲clients/productsadmin_clients_products資源將以您需要的方式工作。

namespace :admin do 
    resources :clients, only: [:index] do 
    resources :products, only: [:index, :new, :create], controller: 'clients/products' 
    end             # ------------------------------ 

    resources :products, only: [:index] 
end 

rails routes現在會給你想要的東西:

admin_client_products GET /admin/clients/:client_id/products(.:format) admin/clients/products#index 
         POST /admin/clients/:client_id/products(.:format)  admin/clients/products#create 
new_admin_client_product GET /admin/clients/:client_id/products/new(.:format) admin/clients/products#new 
admin_clients   GET /admin/clients(.:format)       admin/clients#index 
admin_products   GET /admin/products(.:format)      admin/products#index 

=========================

額外資料:

如果你想省略從URL(我的意思是,如果你的應用的路由設計許可證),那麼你可以使用/admin部分:

scope module: 'admin' do...end
像下面這樣:

scope module: 'admin' do 
    resources :clients, only: [:index] do 
    resources :products, only: [:index, :new, :create], controller: 'clients/products' 
    end 

    resources :products, only: [:index] 
end 

,突然你的路線將開始尋找真棒:)

client_products  GET /clients/:client_id/products(.:format)  admin/clients/products#index 
        POST /clients/:client_id/products(.:format)  admin/clients/products#create 
new_client_product GET /clients/:client_id/products/new(.:format) admin/clients/products#new 
clients    GET /clients(.:format) admin/clients#index 
products   GET /products(.:format) admin/products#index