2011-10-13 18 views
10

से भिन्न कुछ के आधार पर रेल मार्ग रूट तो वर्तमान में मेरे पास कुछ उपयोगकर्ता/उपयोगकर्ता/1/जब मैं उपयोगकर्ता प्रोफ़ाइल देखना चाहता हूं। डुनो इस सवाल पर कितना आसान या आम है, मैं इस बिंदु पर एक रेल नोब का थोड़ा सा हूं, लेकिन मैं इसे/user/chiggins/जहां chiggins एक अद्वितीय उपयोगकर्ता नाम बदलने के लिए मार्ग.आरबी के माध्यम से कैसे जा सकता हूं?आईडी

बहुत बहुत धन्यवाद!

उत्तर

13

आप की जरूरत है उपयोगकर्ता मॉडल में विधि to_param ओवरराइड करने के लिए है:

class User 
    def to_param 
    username 
    end 
end 

फिर रेल यह पूर्ण रूप से अपने मार्ग के लिए प्रयोग करेंगे। http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param

+0

ठीक है, मैंने थोड़ा सा जोड़ा, लेकिन मुझे निम्न त्रुटि मिल रही है: http://chigstuff.com/uploads/user_error.jpg – Chiggins

+0

कभी नहीं, मुझे मेरी समस्या मिली। मेरी शो विधि "@user = user.find (: पैराम्स [: id]) कर रही थी", मैंने इसे उपयोगकर्ता नाम से खोजने के लिए चारों ओर बदल दिया। – Chiggins

+0

अपने कंट्रोलर में कोड बदलें: User.find (params [: id]) लेकिन User.find_first_by_username (पैराम्स [: id]) या to_param के बॉडी को "# {self.id} - # {self.username}" में बदलें –

0

देखें सबसे अच्छा तरीका है एक कस्टम परम के साथ एक मार्ग को परिभाषित करने के लिए है:

match "https://stackoverflow.com/users/:username" => "users#show" 

अपने नियंत्रक में, सादे पुराने पैरामीटर [: id] पैरामीटर हो जाएगा [: उपयोगकर्ता नाम], और आप प्राप्त कर सकते हैं का उपयोग करते हुए डी डीबी से उपयोगकर्ता:

User.find_by_username(params[:username]) 
+0

मैंने अभी अपने मार्गों को पहली पंक्ति में जोड़ा है, हालांकि, उपयोग करने के बजाय: उपयोगकर्ता नाम मुझे अभी भी उपयोग करने की आवश्यकता है: id – Chiggins

1

आप प्राप्त कर सकते हैं प्रति-संसाधन पहचानकर्ता घन संसाधन उदाहरण पर member_scope और nested_scope विधियों को फिर से परिभाषित करके stomization।

resources :users do 
    @scope[:scope_level_resource].tap do |u| 
    def u.member_scope 
     "#{path}/:username" 
    end 

    def u.nested_scope 
     "#{path}/:#{singular}_username" 
     # member_scope also usable here, assuming username will be nowhere in nested routes. 
    end 
    end 
end 

नीचे #nested_scope के बारे में प्रश्न के बारे में: यह इस्तेमाल किया जाता है जब आप मार्ग में कुछ इस तरह करते हैं:

resources :members do 
    resources :playlists, only: :index 
end 

फिर, परम होगा: उपयोगकर्ता नाम: के बजाय सिर्फ member_username। संग्रह को इकट्ठा करते समय यह प्लेलिस्ट नियंत्रक में उपयोगी है ताकि आप अनुरोध के दायरे का अनुमान लगा सकें।

+0

मैं स्वचालित उत्पन्न मार्गों को ओवरराइड करने के लिए "# {path} /: username" समझता हूं, लेकिन मैं नहीं करता समझ में नहीं आता "nested_scope" विधि क्या है ?! – Matrix

+0

अद्यतन उत्तर @Matrix देखें। – 20man