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?
Ha funzionato. Grazie! – derekstavis
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
@DerekWillianStavis 'resources' accetta l'opzione': module => 'behives''. Inoltre puoi usare 'scope: module => 'behives' do ... end' wrapper per la tua risorsa nidificata. – jdoe