2017-05-04 3 views
1

In meinem routes.rb Ziel Ich habeSchienen - wie verschachtelte Controller für verschachtelte Ressource Route

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

    resources :products, only: [:index] 
end 

Beachten Sie, dass ich zwei Linien für resources :products haben. Einer ist verschachtelt innerhalb resources :clients und der andere als eine Top-Level-Ressource auf :admin; jeder von diesen zwei hat einen anderen Zweck in der Anwendung.

rake routes gibt mir:

  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      

Ich habe einen admin_client_products für die verschachtelte product#index Ressource. Ich habe auch admin_products für die Top-Level product#index Ressource. Sie weisen jedoch auf die gleiche Controller-Aktion hin: admin/product#index.

Frage: An diesem Punkt brauche ich Schienen, um daraus abzuleiten, dass dies zwei verschiedene Aktionen sind. Gibt es unter Verwendung von Schienenkonventionen eine Möglichkeit, Schienen mitzuteilen, dass diese zwei Ressourcen unterschiedliche Controlleraktionen haben sollten, d. H. Eine, die admin/products#index erreichen sollte und die andere admin/clients/products#index?

Die verschachtelte Route sollte diese getroffen:

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

Die Top-Level-Strecke dieses schl sollte:

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

Antwort

0

Definitiv Sie können!

Hier müssen Sie Ihre findige Route anpassen, indem Sie explizit einen Controller angeben, der für die Ressource verwendet werden soll. Mit der Option :controller können Sie dies tun.

In Ihrem Fall würde die Angabe des Controllers als clients/products für die Ressource admin_clients_products in Ihrer gewünschten Weise funktionieren.

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 werden Sie jetzt, was Sie wollen:

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 

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

extra-Bits:

wenn Sie den /admin Teil aus der uRL weglassen wollen (ich meine, wenn die Anwendung der Routing-Entwurfsgenehmigungen), dann könnten Sie verwenden:Folgendewie das:

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

    resources :products, only: [:index] 
end 

und Ihre Routen plötzlich beginnen, genial :)

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 
Verwandte Themen