2012-10-11 4 views
5

Ich versuche, meine Rails-Anwendung in zwei Namespaces zu organisieren, die dieselben Ressourcen, aber mit unterschiedlichen Controllern und Sichten bereitstellen. So etwas wie die folgende zenario:Namespaces mit verschachtelten Ressourcen Rails 3.2.8

routes.rb

resources :beehives do 
    resources :bees 
    resources :honeycombs 
end 

namespace :api do 
    resources :beehive, only: [:show] do 
     resources :bees, only: [:index, :show] 
     resources :honeycombs, only: [:index, :show] 
    end 
end 

Gerüst verwenden, ich habe die Controller-Struktur erstellt:

rails g controller api/beehives

rails g controller api/beehives/bees

rails g controller api/beehives/honeycombs

Und die Ordnerstruktur I für Controller bekam klingt wie dies:

Controller/beehives_controller.rb

class Api::BeehivesController < ApplicationController 

Controller/api/beehives_controller.rb

class Api::BeehivesController < ApplicationController 

Controller/api/beehives/bees_controller.rb

class Api::Beehives::BeesController < ApplicationController 

Nun, das war einfach. In diesem Kontext wird /beehives/1 an den Root-Namespace (für die Webanwendung) und /api/beehives/1 an den Namespace "api" (für die Bereitstellung eines RESTful-Webdienstes) weitergeleitet. Das funktioniert wirklich gut. Das Problem ist, wenn ich versuchen, zuzugreifen /api/beehives/1/bees, aus irgendeinem Grund wird die Namespacing auf die verschachtelte Ressource nicht anwenden und Rails spucken diesen Fehler:

uninitialized constant Api::BeesController 

Was mache ich falsch?

Antwort

5

resources :beehive + verschachtelt resources :bees erfordert nicht, dass Ihre jeweiligen Controller ebenfalls verschachtelt sind. Es ist nur eine Möglichkeit, URLs zu erstellen. Also, es ist natürlich, dass Ihre App nach Api::BeesController statt Api::Beehives::BeesController fragt.

Wenn Sie Zweifel haben, verwenden Sie den Befehl rake routes, um Ihre Routen und die zugehörigen Controller zu überprüfen.

+0

Es hat funktioniert. Vielen Dank! – derekstavis

+0

Aber hey @jdoe, das hat meine Ordnerstruktur kaputt gemacht. Ich musste die entsprechenden Controller in "api" -Ordner stellen, anstatt "api/Bienenkörbe". Das zerbricht meine Organisation, weil ich im Ordner "api" mehr als eine Ressource bereitstellen muss. – derekstavis

+5

@DerekWillianStavis 'Ressourcen' akzeptiert': modul => 'Behives'-Option. Sie können auch 'scope: module => 'behives' do ... end 'wrapper für Ihre verschachtelte Ressource verwenden. – jdoe