इस उत्तर का मूल रूप बेतहाशा अलग है, और यहाँ पाया जा सकता है । बस सबूत है कि एक बिल्ली की त्वचा के लिए एक से अधिक तरीके हैं।
मैंने नामस्थान का उपयोग करने और 302 के डिफ़ॉल्ट के बजाय 301 रीडायरेक्ट का उपयोग करने के बाद से उत्तर अपडेट किया है। उन चीजों पर संकेत देने के लिए पिक्सेल्ट्रिक्स और बो जीन का धन्यवाद।
आप वास्तव में एक मजबूत हेलमेट पहनना चाहते हैं क्योंकि यह आपके दिमाग को उड़ाने वाला है ।
रेल 3 रूटिंग एपीआई सुपर दुष्ट है। ऊपर अपनी आवश्यकताओं के अनुसार, अपने एपीआई के लिए मार्गों को लिखने के लिए, आपको बस इसकी आवश्यकता है:
namespace :api do
namespace :v1 do
resources :users
end
namespace :v2 do
resources :users
end
match 'v:api/*path', :to => redirect("/api/v2/%{path}")
match '*path', :to => redirect("/api/v2/%{path}")
end
यदि इस बिंदु के बाद भी आपका दिमाग बरकरार है, तो मुझे समझाएं।
सबसे पहले, हम कहते namespace
हैं कि जब आप एक विशिष्ट पथ और मॉड्यूल के लिए स्कोप किए गए मार्गों का एक गुच्छा चाहते हैं जो समान रूप से नामित हैं , तो सुपर काम है। इस स्थिति में, हम चाहते हैं कि ब्लॉक के अंदर के सभी मार्गों namespace
को Api
मॉड्यूल के भीतर नियंत्रकों के लिए स्कूप किया जाए और इस मार्ग के अंदर आने वाले सभी मार्गों के साथ अनुरोध किया जाएगा api
। अनुरोध जैसे कि /api/v2/users
, फिर जानते हैं?
नामस्थान के अंदर, हम दो और नामस्थानों को परिभाषित करते हैं (woah!)। इस बार हम "वी 1" नाम स्थान तय कर रहे हैं, तो नियंत्रकों यहाँ सभी मार्गों के अंदर हो जाएगा V1
अंदर मॉड्यूल Api
मॉड्यूल: Api::V1
। resources :users
इस मार्ग के अंदर परिभाषित करके , नियंत्रक पर स्थित होगा Api::V1::UsersController
। यह संस्करण 1 है, और आप अनुरोधों को बनाकर वहां पहुंच जाते हैं /api/v1/users
।
संस्करण 2 केवल एक छोटा सा अलग है। नियंत्रक की सेवा के बजाय पर यह किया जा रहा है Api::V1::UsersController
, यह अब पर है Api::V2::UsersController
। आप जैसे अनुरोध करके वहाँ पहुँचते हैं /api/v2/users
।
अगला, एक match
प्रयोग किया जाता है। यह सभी एपीआई मार्गों से मेल खाएगा जो कि चीजों पर जाते हैं /api/v3/users
।
यह वह हिस्सा है जिसे मुझे देखना था। :to =>
विकल्प आपको यह निर्दिष्ट करने के लिए, जो किसी विशेष अनुरोध कहीं और पुनः निर्देशित किया जाना चाहिए की अनुमति देता है - मैं जानता था कि बहुत - लेकिन मैं कैसे इसे कहीं और करने के लिए पुन: निर्देशित और उसके साथ मूल अनुरोध के एक टुकड़े में पारित करने के लिए प्राप्त करने के लिए नहीं पता था ।
ऐसा करने के लिए, हम redirect
विधि को कॉल करते हैं और इसे एक विशेष-प्रक्षेपित %{path}
पैरामीटर के साथ एक स्ट्रिंग पास करते हैं । जब कोई अनुरोध इस अंतिम से मेल खाता है match
, तो यह path
पैरामीटर को %{path}
स्ट्रिंग के अंदर के स्थान में प्रक्षेपित करेगा और उस उपयोगकर्ता को रीडायरेक्ट करेगा जहां उन्हें जाने की आवश्यकता है।
अंत में, हम अन्य match
सभी का उपयोग करते हुए शेष सभी मार्गों को पूर्वनिर्मित करते हैं /api
और उन्हें पुनर्निर्देशित करते हैं /api/v2/%{path}
। इसका मतलब है कि अनुरोध जैसे /api/users
ही जाएंगे /api/v2/users
।
मैं यह पता नहीं लगा सका कि /api/asdf/users
मैच कैसे हो सकता है, क्योंकि आप यह कैसे निर्धारित करते हैं कि यह एक अनुरोध है /api/<resource>/<identifier>
या नहीं /api/<version>/<resource>
?
वैसे भी, यह शोध करने के लिए मजेदार था और मुझे आशा है कि यह आपकी मदद करता है!