2012-04-23 6 views
9

私はモバイルAPI用のルートを設定しようとしていますが、バージョンがapi-pathである必要があります。私は既に別のコントローラAuthController/controllers/api/v1/mobile/に配置されているモバイル認証を行うことができます。ルーティングエラー:初期化されていない定数

使用例:

myapp.com/api/v1/mobile/auth 

しかし、今、私は追加のAPI-ルートとしてこのパスパターンに私の既存のressources-コントローラを登録します。具体的には、これは/controllers/tracker/tasks_controller.rbにあるTasksControllerになります。だから私は、ルート定義にモバイルルートを追加しました:

# 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 

しかし、私はmyapp.com/api/v1/mobile/tracker/tasksを呼び出すときには、エラーメッセージで結果:

上記の元のタスクルートとの競合を避けるために、特に:mobile_tasksエイリアスをこのルートに追加しました。任意のアイデア、どのようにこのルートのコントローラを正しく設定するには?

更新#1

代わりに、名前空間の範囲として、このルートを定義する、aswell動作しませんでした。

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

しかし今回は、ルートパス自体も解決しませんでした。

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

私はそれが私の追加のモバイル-APIのルートは完全に異なる名前空間トラッカーを指すようにしようという、問題があるかもしれないと仮定します。

答えて

19

http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routingによれば、名前空間の代わりにスコープを使用する必要があります。

あなたがルート/admin/postsへ(Admin:: module prefixなし)PostsControllerしたい場合は、あなたが使用できます。

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

こんにちはKrists、あなたの答えに感謝します。私はあなたの提案に関するレール出力で質問文を更新しました。 – loybert

+1

'rake routes'コマンドを試して、定義されたすべてのルートを一致順と名前で表示しましたか?この問題をデバッグするのに役立ちます。 – Krists

+0

'rake routes'の良いヒントです。この問題を解決するために私を助けました:) – loybert

0

後期の答えを、まだ役に立つかもしれません:

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

コントローラ

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

end 

このURLにアクセスできるはずです:

http://localhost:3000/v1/articles

0

名前空間&スコープに明快さを得るために、この答えを追加します。

namespaceを使用すると、指定されたリソースのURLパスの前にプレフィックスが付けられ、ネームスペースと同じ名前のモジュールの下にコントローラが配置されます。

# 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 

スコープを追加すると、指定されたスコープパターンのコントローラアクションがマップされます。任意のモジュールの下でコントローラを定義する必要はありません。

# 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 

コントローラは、モジュールの名前空間のないコントローラに投稿されていることに注意してください。

我々はスコープにpathオプションを追加した場合には、コントローラが現在管理モジュールの下にあることを

# 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 

注意が次のように指定したパスオプションを使用してコントローラにマップされます。

リソースを識別するためにパスメソッドの名前を変更する場合は、asオプションをスコープに追加できます。

# 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 

プレフィックス動詞で変更を確認できます。

他人に役立つことを願っています。

関連する問題