2013-06-12 4 views
22

मैं रेलों के आधार पर एक आरईएसटी एपीआई विकसित कर रहा हूं। इस एपीआई का उपयोग करने के लिए, आपको लॉग इन होना चाहिए। इसके बारे में, मैं अपने उपयोगकर्ता नियंत्रक में एक विधि me बनाना चाहता हूं जो लॉग इन उपयोगकर्ता इंफोस के एक जेसन को वापस कर देगा। तो, मुझे URL में पारित होने के लिए :id की आवश्यकता नहीं है। मैं सिर्फ कॉल करने के लिए http://domain.com/api/users/meरेल मार्ग: बिना पैरा के प्राप्त करें: आईडी

तो मैं इस कोशिश की हैं:

namespace :api, defaults: { format: 'json' } do 
    scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do 
    resources :tokens, :only => [:create, :destroy] 
    resources :users, :only => [:index, :update] do 

     # I tried this 
     match 'me', :via => :get 
     # => api_user_me GET /api/users/:user_id/me(.:format)  api/v1/users#me {:format=>"json"} 

     # Then I tried this 
     member do 
     get 'me' 
     end 
     # => me_api_user GET /api/users/:id/me(.:format)   api/v1/users#me {:format=>"json"} 

    end 
    end 
end 

आप देख सकते हैं, मेरा मार्ग एक आईडी के लिए इंतजार कर रहा है, लेकिन मैं वसीयत की तरह है कुछ प्राप्त करना चाहते हैं। कुछ current_user आईडी पर आधारित है। उदाहरण नीचे:

edit_user_password GET /users/password/edit(.:format)   devise/passwords#edit 

इस उदाहरण में आप एक परम के रूप में आईडी गुजर बिना वर्तमान उपयोगकर्ता पासवर्ड को संपादित कर सकते हैं।

मैं एक सदस्य के बजाय एक संग्रह इस्तेमाल कर सकते हैं, लेकिन यह एक गंदा बाईपास है ...

किसी को भी एक विचार है? आप

उत्तर

14

संसाधन मार्ग इस तरह से काम करने के लिए डिज़ाइन किए गए हैं। यदि आप कुछ अलग करना चाहते हैं, तो इसे स्वयं डिज़ाइन करें।

तो, बजाय resources उपयोग resource:

match 'users/me' => 'users#me', :via => :get 

अपने resources :users ब्लॉक के बाहर यह रखो

+0

शानदार अरजन। वास्तव में मुझे क्या चाहिए ... सिवाय इसके कि मेरे पास पथ नहीं होगा लेकिन मैं इसके बिना कर सकता हूं। चीयर्स। – Gozup

+0

कोई समस्या नहीं है, आप ': as =>' me'' जोड़कर पथ जोड़ सकते हैं। यह 'me_path' और' me_url' जोड़ देगा। – Arjan

+0

ग्रेट। उसे नहीं पता था। धन्यवाद – Gozup

6

धन्यवाद शायद मैं कुछ याद आ रही है, लेकिन आप का उपयोग क्यों नहीं करते हैं:

get 'me', on: :collection 
+0

क्या यही कारण है कि में मैंने अपने निष्कर्ष में कहा। यह संग्रह एक अच्छा काम नहीं है क्योंकि संग्रह एकाधिक ऑब्जेक्ट की एक सरणी है। मैं current_user के लिए पूछ रहा हूं, इसलिए 1 ऑब्जेक्ट, इसलिए एक सदस्य ;-) – Gozup

+0

अर्थात् गलत, मेरे दोस्त – barbolo

0

जब आप एक मार्ग एक संसाधन के भीतर नेस्ट बनाते हैं, आप उल्लेख कर सकते हैं, यह सदस्य क्रिया या एक संग्रह है कि क्या कार्रवाई।

namespace :api, defaults: { format: 'json' } do 
    scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do 
    resources :tokens, :only => [:create, :destroy] 
    resources :users, :only => [:index, :update] do 

     # I tried this 
     match 'me', :via => :get, :collection => true 
... 
... 
+0

यही है मेरे निष्कर्ष में कहा। यह एक अच्छा काम नहीं है क्योंकि संग्रह एक ऑब्जेक्ट की एक सरणी है। मैं current_user के लिए पूछ रहा हूं, इसलिए 1 ऑब्जेक्ट, तो एक mem बियर ;-) – Gozup

63

जाने का रास्ता singular resources उपयोग करने के लिए है

कभी कभी, आप एक है संसाधन जो ग्राहक हमेशा आईडी को संदर्भित किए बिना देखते हैं। उदाहरण के लिए, आप वर्तमान में लॉग इन उपयोगकर्ता की प्रोफ़ाइल हमेशा दिखाना चाहते हैं। (: आईडी के बजाय/प्रोफ़ाइल /) शो कार्रवाई करने के लिए [...]

तो, आपके मामले में: इस मामले में, आप/प्रोफ़ाइल मैप करने के लिए एक विलक्षण संसाधन का उपयोग कर सकते

resource :user do 
    get :me, on: :member 
end 

# => me_api_user GET /api/users/me(.:format)   api/v1/users#me {:format=>"json"} 
+1

बढ़िया, यह सिर्फ मेरी रूट फ़ाइल को बहुत आसान बना दिया। –

+2

इसे स्वीकार किया जाना चाहिए। जबकि 'प्राप्त करें' उपयोगकर्ता/मुझे '=>' उपयोगकर्ता # मैं 'काफी अच्छी तरह से काम करता है, उन्हें एकवचन संसाधन के रूप में वर्गीकृत करना एक क्लीनर दृष्टिकोण है। – Orlando

+1

स्वीकार्य उत्तर होना चाहिए – qbantek

5
resources :users, only: [:index, :update] do 
    collection do 
     get :me, action: 'show' 
    end 
    end 

कार्रवाई निर्दिष्ट करना वैकल्पिक है। आप यहां कार्रवाई छोड़ सकते हैं और me के रूप में अपनी नियंत्रक कार्रवाई का नाम दे सकते हैं।

4

आप

resources :users, :only => [:index, :update] do 
    get :me, on: :collection 
end 

या

resources :users, :only => [:index, :update] do 
    collection do 
    get :me 
    end 
end 

उपयोग कर सकते हैं "एक सदस्य मार्ग एक आईडी है, क्योंकि यह एक सदस्य पर कार्य करता है, क्योंकि यह एक संग्रह पर काम करता है की आवश्यकता होगी। एक संग्रह मार्ग नहीं है वस्तुओं कापूर्वावलोकन सदस्य मार्ग का एक उदाहरण है, क्योंकि यह एक ऑब्जेक्ट पर (और प्रदर्शित करता है) पर कार्य करता है। खोज (here से), क्योंकि यह (और प्रदर्शित करता है) पर काम करता है वस्तुओं का संग्रह, एक संग्रह मार्ग का एक उदाहरण है। "

0

यह अर्जन के रूप में एक ही परिणाम देता है आसान तरीका

get 'users/me', to: 'users#me'

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