2012-04-23 17 views
9

Ich versuche, Routen für eine mobile API einzurichten, die einen versionierten API-Pfad haben sollte. Ich konnte bereits die mobile Auth-Arbeit machen, die in einem separaten Controller AuthController in /controllern/api/v1/mobile/ implementiert ist.Routingfehler: nicht initialisierte Konstante

Anwendungsbeispiel:

myapp.com/api/v1/mobile/auth 

Aber jetzt will ich meine vorhandenen Ressourcen-Controller auf diesem Weg Muster als zusätzliche api-Routen registrieren. Beton: Dies wäre die TasksController bei /controllers/tracker/tasks_controller.rb. So habe ich eine mobile Route zum Route-Definition:

# 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 

Aber wenn ich rufe myapp.com/api/v1/mobile/tracker/tasks führt dies zu einer Fehlermeldung:

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

Ich habe speziell den Alias ​​: mobile_tasks zu dieser Route hinzugefügt, um Konflikte mit der ursprünglichen Aufgaben-Route oben zu vermeiden. Irgendwelche Ideen, wie man den Controller für diese Route richtig einstellt?

Update # 1

definieren diese Route als Rahmen anstelle eines Namespace, hat nicht funktioniert ebenfalls.

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

Aber dieses Mal hat es nicht einmal den Routenpfad selbst aufgelöst.

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

Ich nehme an, es könnte ein Problem sein, dass meine zusätzliche mobile-api Route zu einem völlig anderen Namespace Tracker zu Punkt versucht.

Antwort

19

Entsprechend http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing sollten Sie Scope anstelle von Namespace verwenden.

Wenn Sie /admin/posts-PostsController routen (ohne Admin:: module prefix), könnten Sie verwenden:

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

Hallo Kristen, danke für deine Antwort. Ich habe meinen Fragetext mit der Rails-Ausgabe zu deinem Vorschlag aktualisiert. – loybert

+1

Haben Sie den Befehl 'rake routes' ausprobiert, um alle definierten Routen in der Reihenfolge und den Namen der Übereinstimmung auszudrucken? Es sollte Ihnen helfen, dieses Problem zu beheben. – Krists

+0

Danke für den guten Hinweis mit 'Rake Routen'. half mir, dies zu erarbeiten :) – loybert

0

Späte Antwort, aber immer noch hilfreich sein könnte:

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

Controller

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

end 

Jetzt sollten Sie auf diese URL zugreifen können:

http://localhost:3000/v1/articles

0

diese Antwort Hinzufügen Klarheit auf Namespace & Umfang zu erhalten.

Wenn Sie den Namespace verwenden, wird er dem URL-Pfad für die angegebenen Ressourcen vorangestellt und versucht, den Controller unter einem Modul zu finden, das auf die gleiche Weise wie der Namespace benannt ist.

Wenn wir den Bereich hinzufügen, wird nur die Controlleraktion für die angegebenen Bereichsmuster zugeordnet. Keine Notwendigkeit, Controller unter irgendeinem Modul zu definieren.

# 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 

Beachten Sie, dass die Steuerung nur Beiträge Controller ohne Modul-Namensraum ist.

Wenn wir eine path Option Rahmen hinzufügen, wird es mit dem Pfad-Option an den Controller Karte wie folgt angegeben

# 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 

Beachten Sie, dass der Controller nun unter Admin-Modul ist.

Wenn wir jetzt den Namen der Pfadmethode ändern möchten, um die Ressource zu identifizieren, können wir die Option as zum Bereich hinzufügen.

# 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 

Sie können die Änderung im Präfix Verb sehen.

Ich hoffe, es hilft anderen.

Verwandte Themen