2012-04-23 19 views
9

Estoy intentando configurar rutas para una API móvil, que debería tener una api-ruta versionada. Ya pude hacer que el Auth móvil funcione, que se implementa en un Controlador independiente AuthController ubicado en /controladores/api/v1/mobile/.Error de enrutamiento: constante no inicializada

Ejemplo de uso:

myapp.com/api/v1/mobile/auth 

Pero ahora quiero registrar mi Ressources-controladores existentes a este camino de patrón como API-rutas adicionales. Concreto: este sería el TasksController ubicado en /controllers/tracker/tasks_controller.rb. Por lo que añade una ruta móvila la definición de rutas:

# routes.rb 
namespace :tracker, path: 'timetracking' do 
    resources :tasks, 'jobs' 
end 

namespace :api do 
    namespace :v1 do 
    namespace :mobile do 
     resources :auth, :only => [:create, :destroy] 

     namespace :tracker do #added mobile route 
     resource :tasks, controller: 'tracker/tasks', as: :mobile_tasks 
     end 
    end 
    end 
end 

Pero cuando llamo myapp.com/api/v1/mobile/tracker/tasks que se traduce en un mensaje de error:

Routing Error 
uninitialized constant Api::V1::Mobile::Tracker 

Agregué especialmente el alias : mobile_tasks a esta ruta, para evitar cualquier conflicto con la ruta de tareas original anterior. ¿Alguna idea, cómo configurar el controlador correctamente para esta ruta?

Actualización # 1

Definir esta ruta como un ámbito en lugar de un espacio de nombres, no funcionó también.

scope "/api/v1/mobile/tracker" do 
    resources :tasks, controller: 'tracker/tasks', as: :mobile_tasks 
end 

Pero esta vez, ni siquiera resolvió la ruta misma.

Routing Error 
No route matches [GET] "/api/v1/mobile/tracker/tasks" 

supongo que podría ser un problema, que mi ruta móviles API adicional trata de apuntar a un espacio de nombres completamente diferente rastreador.

Respuesta

19

De acuerdo con http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing debe usar scope en lugar de namespace.

Si desea enrutar /admin/posts-PostsController (sin el Admin:: module prefix), que puede usar:

scope "/admin" do 
    resources :posts, :comments 
end 
+0

Hola Krists, gracias por tu respuesta. Actualicé mi pregunta-texto con los rieles-salida con respecto a su sugerencia. – loybert

+1

¿Ha probado el comando 'rake routes' para imprimir todas las rutas definidas en orden de coincidencia y nombres? Debería ayudarlo a depurar este problema. – Krists

+0

thx por la buena pista con 'rutas de rastrillo'. me ayudó a resolver esto :) – loybert

0

respuesta tardía, pero aún podría ser útil:

scope '/v1' do 
    resources :articles, module: 'v1' 
end 

controlador

# app/controller/v1/articles_controller.rb 
class V1::ArticlesController < ApplicationController 

end 

Ahora debería poder acceder a esta url:

http://localhost:3000/v1/articles

0

La adición de esta respuesta para obtener claridad sobre el alcance & espacio de nombres.

Cuando usa el espacio de nombres, prefijará la ruta URL para los recursos especificados, y tratará de ubicar el controlador bajo un módulo nombrado de la misma manera que el espacio de nombres.

# config/routes.rb 
namespace :admin do 
    resources :posts, only: [:index] 
end 

# rake routes 
Prefix Verb URI Pattern     Controller#Action 
admin_posts GET /admin/posts(.:format) admin/posts#index 

Cuando añadimos alcance, sólo habrá un mapa de la acción del controlador para los patrones ámbito determinado. No es necesario definir el controlador bajo ningún módulo.

# config/routes.rb 
scope :admin do 
    resources :posts, only: [:index] 
end 

# rake routes 
Prefix Verb URI Pattern     Controller#Action 
admin_posts GET /admin/posts(.:format) posts#index 

Tenga en cuenta que, el controlador es el controlador sólo mensajes sin ningún espacio de nombres de módulo.

Si añadimos una opción path al alcance que se proyectará en el controlador con la opción de ruta especificada de la siguiente manera

# config/routes.rb 
scope module 'admin', path: 'admin' do 
    resources :posts, only: [:index] 
end 

# rake routes 
Prefix Verb URI Pattern     Controller#Action 
admin_posts GET /admin/posts(.:format) admin/posts#index 

Tenga en cuenta que el controlador ahora está bajo módulo de administración.

Ahora, si queremos cambiar el nombre del método de ruta para identificar el recurso, podemos agregar la opción as al ámbito.

# config/routes.rb 
namespace module: 'admin', path: 'admin', as: 'root' do 
    resources :posts, only: [:index] 
end 

# rake routes 
Prefix Verb URI Pattern     Controller#Action 
root_posts GET /admin/posts(.:format) admin/posts#index 

Puede ver el cambio en el verbo Prefijo.

Espero que ayude a los demás.

Cuestiones relacionadas