2012-04-23 16 views
9

मैं एक मोबाइल एपीआई के लिए मार्ग स्थापित करने की कोशिश कर रहा हूं, जिसमें संस्करण एपीआई-पथ होना चाहिए। मैं पहले ही मोबाइल ऑथ काम कर सकता हूं, जिसे /नियंत्रक/एपीआई/वी 1/मोबाइल/ में स्थित एक अलग नियंत्रक ऑथकंट्रोलर में कार्यान्वित किया गया है।रूटिंग त्रुटि: अनियमित स्थिर

प्रयोग उदाहरण:

myapp.com/api/v1/mobile/auth 

लेकिन अब मैं अतिरिक्त api-मार्गों के रूप में इस पथ-पैटर्न के लिए अपने मौजूदा ressources-नियंत्रकों पंजीकृत करना चाहते हैं। कंक्रीट: यह कार्य नियंत्रक/controllers/tracker/tasks_controller.rb पर स्थित होगा। इसलिए मैं मार्गों परिभाषा करने के लिए एक मोबाइल मार्ग कहा:

# 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 फोन यह एक त्रुटि संदेश में परिणाम:

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

मैं विशेष रूप से उर्फ ​​कहा: mobile_tasks इस मार्ग को, मूल ऊपर कार्य-मार्ग के साथ किसी भी टकराव से बचने के लिए। कोई विचार, इस मार्ग के लिए नियंत्रक को सही तरीके से कैसे सेट करें?

अद्यतन # 1

एक namespace के बजाय एक गुंजाइश के रूप में इस मार्ग को परिभाषित करना, अच्छी तरह से काम नहीं किया।

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 के अनुसार आपको नामस्थान के बजाय दायरे का उपयोग करना चाहिए।

आप PostsController (Admin:: module prefix के बिना) के लिए रास्ते में /admin/posts करना चाहते हैं, तो आप इस्तेमाल कर सकते हैं:

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

हाय क्रिस्ट, आपके उत्तर के लिए धन्यवाद। मैंने आपके प्रश्न-पाठ को आपके सुझाव के संबंध में रेल-आउटपुट के साथ अपडेट किया। – loybert

+1

क्या आपने मैच आदेश और नामों में सभी परिभाषित मार्गों को मुद्रित करने के लिए 'रेक मार्ग' आदेश का प्रयास किया है? यह आपको इस समस्या को डीबग करने में मदद करनी चाहिए। 'रेक मार्ग' के साथ अच्छे संकेत के लिए – Krists

+0

thx। मुझे यह काम करने में मदद मिली :) – loybert

0

देर जवाब है, लेकिन अभी भी उपयोगी हो सकता है:

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

नियंत्रक

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

end 

अब आप इस यूआरएल तक पहुंचने में सक्षम होना चाहिए:

http://localhost:3000/v1/articles

0

इस उत्तर जोड़ना नाम स्थान & गुंजाइश पर स्पष्टता प्राप्त करने के लिए।

जब आप नामस्थान का उपयोग करते हैं, तो यह निर्दिष्ट संसाधनों के लिए यूआरएल पथ उपसर्ग करेगा, और नेमस्पेस के समान नामक मॉड्यूल के तहत नियंत्रक का पता लगाने का प्रयास करेगा।

# 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 

आप उपसर्ग वर्ब में परिवर्तन देख सकते हैं।

आशा है कि यह दूसरों की सहायता करे।

संबंधित मुद्दे