2012-10-11 69 views
5

Estoy tratando de organizar mi aplicación Rails en dos espacios de nombres que proporcionan los mismos recursos, pero con diferentes controladores y vistas. Algo así como lo siguiente cenario:Espacios de nombres con recursos anidados 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 

El uso de andamios, he creado la estructura de los controladores:

rails g controller api/beehives

rails g controller api/beehives/bees

rails g controller api/beehives/honeycombs

Y la estructura de carpetas que tengo para controladores suena como esto:

controladores/beehives_controller.rb

class Api::BeehivesController < ApplicationController 

controladores/api/beehives_controller.rb

class Api::BeehivesController < ApplicationController 

controladores/api/colmenas/bees_controller.rb

class Api::Beehives::BeesController < ApplicationController 

Bueno, eso fue fácil. En este contexto, /beehives/1 se enrutará al espacio de nombre raíz (destinado a la aplicación web) y /api/beehives/1 al espacio de nombres "api" (destinado a proporcionar un servicio web RESTful). Eso está funcionando realmente bien. El problema es cuando intento acceder /api/beehives/1/bees, por alguna razón, el namespacing no está aplicando al recurso anidado y rieles escupir este error:

uninitialized constant Api::BeesController 

Lo que estoy haciendo mal?

Respuesta

5

resources :beehive + anidados resources :bees no requiere que sus respectivos controladores se aniden también. Es solo una forma de construir URLs. Por lo tanto, es natural que su aplicación solicite Api::BeesController en lugar de Api::Beehives::BeesController.

Si tiene alguna duda, use el comando rake routes para verificar sus rutas y sus controladores asociados.

+0

Funcionó. ¡Gracias! – derekstavis

+0

Pero oye @jdoe, esto rompió la estructura de mi carpeta. Tuve que poner los controladores relacionados dentro de la carpeta 'api', en lugar de' api/beehives'. Eso rompe mi organización porque dentro de la carpeta 'api' tendré más de un recurso para proporcionar. – derekstavis

+5

@DerekWillianStavis 'resources' acepta la opción': module => 'behives''. También puede usar 'scope: module => 'behives' do ... end' wrapper para su recurso anidado. – jdoe

Cuestiones relacionadas