2012-10-11 25 views
5

Próbuję zorganizować moją aplikację Rails w dwóch obszarach nazw, które zapewniają te same zasoby, ale z różnymi kontrolerami i widokami. Coś jak na poniższym cenario:Przestrzenie nazw z zasobami zagnieżdżonymi 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 

Korzystanie rusztowanie, I utworzeniu struktury regulatorów:

rails g controller api/beehives

rails g controller api/beehives/bees

rails g controller api/beehives/honeycombs

a struktura folderów dostałem kontrolerów brzmi jak to:

controllers/beehives_controller.rb

class Api::BeehivesController < ApplicationController 

controllers/api/beehives_controller.rb

class Api::BeehivesController < ApplicationController 

controllers/api/ule/bees_controller.rb

class Api::Beehives::BeesController < ApplicationController 

dobrze, to było łatwe. W tym kontekście /beehives/1 spowoduje przejście do głównej przestrzeni nazw (przeznaczonej dla aplikacji internetowej) i /api/beehives/1 do przestrzeni nazw "api" (przeznaczonej do świadczenia usługi internetowej RESTful). To działa naprawdę dobrze. Problem jest, gdy próbuję dostęp /api/beehives/1/bees, z jakiegoś powodu, Przestrzenie nazw nie ubiega się zasobu zagnieżdżonego Rails i pluć ten błąd:

uninitialized constant Api::BeesController 

Co robię źle?

Odpowiedz

5

resources :beehive + zagnieżdżony resources :bees nie wymaga również zagnieżdżania odpowiednich kontrolerów. To tylko sposób na tworzenie adresów URL. Naturalnie aplikacja prosi o numer Api::BeesController zamiast Api::Beehives::BeesController.

Jeśli masz jakiekolwiek wątpliwości, użyj polecenia rake routes, aby sprawdzić trasy i powiązane z nimi kontrolery.

+0

Zadziałało. Dzięki! – derekstavis

+0

Ale hej @ jdoe, to złamało moją strukturę folderów. Musiałem umieścić powiązane kontrolery wewnątrz folderu 'api', zamiast' api/ule'. To łamie moją organizację, ponieważ w folderze 'api' będę miał więcej niż jeden zasób. – derekstavis

+5

"Zasoby' DerekWillianStavis 'akceptuje opcję': module => 'behives''. Możesz także użyć 'scope: module => 'zachowuje' do ... koniec' opakowania dla twojego zagnieżdżonego zasobu. – jdoe