2010-05-14 20 views
40

पर रूबी का उपयोग करते हुए 3 की नई अनुमार्गण प्रणाली, यह संभव है डिफ़ॉल्ट परिवर्तित करने को बदलने के लिए: आईडी पैरामीटररेल में आईडी पैरामीटर मार्ग

resources :users, :key => :username 

निम्नलिखित मार्गों

/users/new 
/users/:username 
/users/:username/edit 
...etc 

मैं के साथ बाहर आने मैं पूछ रहा हूं क्योंकि यद्यपि उपर्युक्त उदाहरण सरल है, मैं वर्तमान प्रोजेक्ट में काम करना चाहता हूं जो मैं काम कर रहा हूं।

क्या यह पैरामीटर बदलना संभव है, और यदि नहीं, तो क्या कोई विशेष कारण नहीं है?

+3

मुझे इस प्रश्न को परिप्रेक्ष्य से पसंद है "मैं उपयोगकर्ता/वस्तु/आदि लाने के लिए उपयोग की जाने वाली डिफ़ॉल्ट आईडी कैसे बदलूं?" हालांकि, मैं सिर्फ उस डिफ़ॉल्ट आईडी को अस्पष्ट करने के लिए एक प्लग डालना चाहता हूं क्योंकि यह सीधे डेटाबेस से प्राथमिक कुंजी है और सुरक्षा के सभी कारण हैं कि आपको उस मूल्य का खुलासा क्यों नहीं करना चाहिए (एसक्यूएल इंजेक्शन हमलों को आसान बनाना, अनुमानित आईडी अन्य उपयोगकर्ताओं के लिए ...)। विशेष रूप से, उपयोगकर्ता नाम का उपयोग किसी खाते (पीडब्ल्यू अनुमान लगाने) पर प्रत्यक्ष हमला करने में सक्षम बनाता है। एक बड़े यादृच्छिक और अद्वितीय मूल्य का उपयोग करना इन सभी को बहुत कठिन बनाता है। चीयर्स। –

+0

* स्वीकृत एक * – blnc

उत्तर

34

यदि मैं आपको सही ढंग से समझता हूं, तो आप अपने यूआरएल में id के बजाय username रखना चाहते हैं, है ना?

आप अपने मॉडल में to_param विधि को ओवरराइड करके ऐसा कर सकते हैं। आप अधिक जानकारी here प्राप्त कर सकते हैं।

+0

के बाद उत्तर पढ़ने के लिए सुनिश्चित करें मुझे लगता है कि अब इसके बारे में जाने का यह एकमात्र तरीका है। हालांकि चौराहे की तरह लगता है। – joeellis

+1

इस सूचक के लिए धन्यवाद, पूरी तरह से मेरी समस्या हल हो गई। मैं यहां आया हूं कि इस बी/सी को नीति के अनुसार कैसे बदला जाए, हम सुरक्षा कुंजी के रूप में वेब से प्राथमिक कुंजी आईडी द्वारा लाने पर विचार करते हैं। इसके बजाए, हम ऑब्जेक्ट (SecureRandom.urlsafe_base64 (15)) के लिए एक बड़ा यादृच्छिक और अद्वितीय मान जोड़ते हैं और इसका उपयोग उस आईडी के रूप में करते हैं जब आईडी को to_param से लौटाया जाता है और जब RESTful APIs_by_OID मिलता है। शायद, जब मैं रूबी/रेलों को बेहतर समझता हूं, तो इसे एक मणि में बनाया जा सकता है। –

0

उपयोगकर्ता नाम पथ पथकों के इनपुट के रूप में पास करें।

आपके विचार कोड में:

user_path(u.username) #/users/john 

अपने नियंत्रक में id प्राप्त username के रूप में इलाज:

def show 
    user = User.find_by_username!(params[:id]) 
    ... 
end 
+0

यह वही है जो मैं कर रहा हूं, लेकिन मुझे लगता है कि यह कोड में User.find_by_username (पैराम्स [: उपयोगकर्ता नाम]) जैसे कुछ करने के लिए अधिक सरल होगा। मैं वास्तव में सोच रहा हूं कि क्यों रेल इसे सामान्य रूप से अनुमति नहीं देते हैं। क्या यह शायद कुछ आरईएसटी सिद्धांत के खिलाफ है? – joeellis

1

हालांकि इस सवाल का जवाब प्रश्नकर्ता द्वारा स्वीकार किया गया है, लेकिन वहाँ के लिए एक सरल तरीका है यह करो। इस कोड को अपने नियंत्रक में लिखें।

authorize_resource :find_by => :username 

और अपने विचार में, जहां आप लिंक दिखाना चाहते हैं, इस कोड को लिखें।

<%= link_to "Username", user_path(u.username) %> 

आपको अपने मार्गों या नियंत्रक में किसी भी अन्य बदलाव की आवश्यकता नहीं है।

अद्यतन: यह केवल तभी काम करेगा जब आप कैनकन मणि का उपयोग कर रहे हों।

+0

यह कैनकन विधि प्रतीत होता है। रेलवे एपीआई में इसका उल्लेख नहीं है। [apidock.com] (http://apidock.com/rails/search?query=authorize_resource) [api.rubyonrails.org] (http://api.rubyonrails.org/?q=authorize_resource) – Nultyi

+0

हां, वह है एक कैनकन विधि। मैं अपने जवाब में उल्लेख करना भूल गया। मैंने जवाब अपडेट किया है। – KULKING

1

FriendlyId मणि इस के साथ आपकी मदद कर सकता है। रयान बेट्स के पास इस मणि का उपयोग करने पर video tutorial अच्छा है।

61

अपने मार्ग में आप ऑन रेल्स 4,1

resources :user, param: :username 
+4

यह स्वीकार्य उत्तर होना चाहिए, मैं 'to_param' विधि – omnikron

+1

@omnikron को ओवरराइट करने के बजाय एक मार्ग पर तर्क जोड़ने में अधिक आरामदायक हूं, यह आपके ऐप में प्राप्त करने की कोशिश करने पर निर्भर करता है, कभी-कभी आपको दोनों को करने की आवश्यकता होती है (उदाहरण के लिए जब आप अपने संसाधन को सीधे रूटिंग हेल्पर्स 'user_path @ user' पर पास करना चाहते हैं ताकि आपको' user_path @ user.username' 'करने की आवश्यकता न हो) ... लेकिन हाँ आप सही हैं, यह केवल सुरुचिपूर्ण है जब आप बस रूटिंग कार्यक्षमता चाहते हैं। – equivalent8

+3

यह केवल रेल 4+ –

23

रूबी के लिए उपयोग कर सकते हैं।4 (और संभवतः पिछले संस्करणों) आप क्या दोनोंj.. और Ujjwal सुझाव क्या करने की जरूरत:

1) config/routes.rb में, जोड़ें:

resources :user, param: :username 

2) app/models/user.rb में, जोड़ें:

def to_param 
    username 
end 

आप केवल # 1 करते हैं तो आपके सभी मार्ग सही होंगे, जैसा कि rake routes से देखा जा सकता है:

$ rake routes 
    Prefix Verb URI Pattern     Controller#Action 
user_index GET /user(.:format)    user#index 
      POST /user(.:format)    user#create 
    new_user GET /user/new(.:format)   user#new 
edit_user GET /user/:username/edit(.:format) user#edit 
     user GET /user/:username(.:format)  user#show 
      PATCH /user/:username(.:format)  user#update 
      PUT /user/:username(.:format)  user#update 
      DELETE /user/:username(.:format)  user#destroy 

हालांकि User उदाहरण के आधार पर एक यूआरएल बनाने वाले सहायक तरीकों में यूआरएल में id शामिल होगा, उदाहरण के लिए /user/1। निर्मित यूआरएल में username प्राप्त करने के लिए, आपको to_param को # 2 में ओवरराइड करने की आवश्यकता है।

+4

2) यह प्रश्न तब होता है जब यह प्रश्न प्रकट होता है; यह स्वीकृत उत्तर – Ben

+0

** ** 'रेल 5.0.2' ** और **' ruby ​​2.4.1' के साथ काम करता है – blnc

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