Módulos de enrutamiento y controlador de Rails -namespacing?

Tengo problemas para crear un módulo para mi controlador y para que mis rutas apunten a ese módulo dentro del controlador.

Obteniendo este error:

Routing Error uninitialized constant Api::Fb 

Entonces, así es como se configuran mis rutas:

 namespace :api do namespace :fb do post :login resources :my_lists do resources :my_wishes end end end 

En mi fb_controller quiero incluir módulos que me den rutas como esta:

 /api/fb/my_lists 

Esto es parte de mi fb_controller:

 class Api::FbController  [:login] include MyLists # <-- This is where i want to include the /my_lists # namespace(currently not working, and gives me error # mentioned above) def login #loads of logic end end 

El archivo MyLists.rb (donde defino un módulo) está en el mismo directorio que fb_controller.rb.

¿Cómo puedo hacer que el espacio para nombres apunte a mi módulo dentro del controlador fb, como / api / fb / my_lists?

El espacio de nombres que ha configurado está buscando una clase de controlador que tenga este aspecto

class Api::Fb::MyListsController

Si desea tener una ruta que se parezca a /api/fb/my_lists pero desea seguir usando FbController lugar de tener un MyListsController , debe configurar sus rutas para que luzcan así.

 namespace :api do scope "/fb" do resources :my_lists, :controller => 'fb' end end 

En mi opinión, en lugar de incluir un módulo MyLists en su FbController parece un poco incómodo.

Lo que probablemente haría es tener un módulo FB con un FbController genérico y luego tener MyListsController < FbController . De todos modos, esto está más allá del scope de su pregunta.

Lo anterior debe responder a sus necesidades.

EDITAR

A partir de sus comentarios, y mis suposiciones sobre lo que está tratando de hacer esto es un pequeño ejemplo:

config / route.rb

 namespace :api do scope "/fb" do post "login" => "fb#login" # some fb controller specific routes resources :my_lists end end 

api / fb / fb_controller.rb

 class Api::FbController < ApiController # some facebook specific logic like authorization and such. def login end end 

api / fb / my_lists_controller.rb

 class Api::MyListsController < Api::FbController def create # Here the controller should gather the parameters and call the model's create end end 

Ahora, si todo lo que desea es crear un objeto MyList , simplemente puede hacer la lógica directamente al modelo. Si, por otro lado, quiere manejar un poco más de lógica, querría poner esa lógica en un Objeto de Servicio que maneja la creación de una MyList y sus deseos asociados o su modelo MyList . Probablemente iría para el objeto de servicio sin embargo. Tenga en cuenta que el objeto de servicio debe ser una clase y no un módulo.

En su ejemplo, Fb no es un espacio de nombres, es un controlador. La llamada al espacio de nombres obliga a la aplicación a buscar un módulo Fb que no existe. Intenta configurar tus rutas de esta manera:

 namespace :api do resource :fb do post :login resources :my_lists do resources :my_wishes end end end 

Opcionalmente, puede definir un nuevo controlador base para el espacio de nombres de API:

 # app/controllers/api/base_controller.rb class Api::BaseController < ApplicationController end 

Si lo haces, tus otros controladores pueden heredar de esto:

 # app/controllers/api/fb_controller.rb class Api::FbController < Api::BaseController end 

La ejecución de rake routes debería darle una idea de cómo están distribuidos sus otros controladores. Solo una advertencia: generalmente no se recomienda tener recursos nesteds con más de 1 profundidad (va a terminar con rutas complejas como edit_api_fb_my_list_my_wish_path ). Si puede diseñar esto de una manera más sencilla, probablemente lo tendrá más fácil.