2012-10-11 19 views
5

Sto cercando di organizzare la mia applicazione Rails in due spazi dei nomi che forniscono le stesse risorse, ma con diversi controller e viste. Qualcosa di simile a quanto segue Cenario:Spazi dei nomi con risorse nidificate 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 

Utilizzando impalcatura, ho creato la struttura controller:

rails g controller api/beehives

rails g controller api/beehives/bees

rails g controller api/beehives/honeycombs

E la struttura delle cartelle ho ottenuto per i controllori suona come this:

controllori/beehives_controller.rb

class Api::BeehivesController < ApplicationController 

controllori/api/beehives_controller.rb

class Api::BeehivesController < ApplicationController 

controllori/api/alveari/bees_controller.rb

class Api::Beehives::BeesController < ApplicationController 

Beh, è stato facile. In questo contesto, /beehives/1 eseguirà il routing verso lo spazio dei nomi di root (inteso per l'applicazione Web) e lo /api/beehives/1 nello spazio dei nomi "api" (destinato a fornire un servizio web RESTful). Funziona davvero bene. Il problema è quando provo ad accedere /api/beehives/1/bees, per qualche ragione, il namespacing Non sta applicando alla risorsa annidata e Rails spiedo questo errore:

uninitialized constant Api::BeesController 

Quello che sto facendo male?

risposta

5

resources :beehive + nidificato resources :bees non richiede che anche i rispettivi controller siano nidificati. È solo un modo di costruire URL. Quindi, è ovvio che la tua app richieda Api::BeesController anziché Api::Beehives::BeesController.

In caso di dubbi, utilizzare il comando rake routes per verificare i percorsi e i relativi controller associati.

+0

Ha funzionato. Grazie! – derekstavis

+0

Ma hey @jdoe, questo ha rotto la mia struttura di cartelle. Ho dovuto mettere i relativi controller nella cartella 'api', invece di' api/alveari'. Questo rompe la mia organizzazione perché all'interno della cartella 'api' avrò più di una risorsa da fornire. – derekstavis

+5

@DerekWillianStavis 'resources' accetta l'opzione': module => 'behives''. Inoltre puoi usare 'scope: module => 'behives' do ... end' wrapper per la tua risorsa nidificata. – jdoe