2011-10-12 15 views
19

के बजाय उपयोगकर्ता नाम के लिए रूट मार्ग मैं/उपयोगकर्ता/1/उपयोगकर्ता नाम से रेल मार्गों को बदलने की कोशिश कर रहा हूं। मैंने वर्तमान में इसे सेट अप किया है, इसलिए यह दिखाने और संपादित करने के कार्यों के लिए काम करता है। वास्तविक मुद्दा यह है कि जब मैं का उपयोग करके उपयोगकर्ता को अद्यतन करने के लिए जाना:आईडी

<%= form_for @user do |f|%> 

यह कभी नहीं अद्यतन, क्योंकि अद्यतन कार्रवाई करने के लिए/उपयोगकर्ताओं/रूट किया जाता है: आईडी। क्या इसका मार्ग बनाने का कोई तरीका है ताकि यह/उपयोगकर्ता नाम के लिए काम करे? (जो मार्ग है जो मेरे रूपों में कार्रवाई के रूप में प्रस्तुत कर रहा है)। मैं थोड़ी देर के लिए इस पर अपने सिर खरोंच कर रहा हूँ।

संपादित करें:

मुद्दा उपयोगकर्ता नाम करने के लिए मार्ग नहीं है, कि इसे सही ढंग से काम कर रहे। मुद्दा यह है कि फॉर्म अपडेट के लिए उपयोगकर्ता नाम/उपयोगकर्ता नाम है, हालांकि उपयोगकर्ताओं के लिए अद्यतन मार्ग अभी भी/उपयोगकर्ता/आईडी है:/id।

मैं इस के लिए मेरे मार्गों को अद्यतन करने की कोशिश की, लेकिन कोई लाभ नहीं हुआ:

match '/:id', :to => "users#show", :as => :user 
match '/:id', :to => "users#update", :as => :user, :via => :put 
match '/:id', :to => "users#destroy", :as => :user, :via => :delete 

संपादित करें:

रवींद्र!

match '/:id', :to => "users#show", :as => :user, :via => :get 

उत्तर

32

अपने उपयोगकर्ता मॉडल में:

def to_param 
    username 
end 

ActiveRecord पर to_param विधि वस्तुओं का उपयोग करता है, बस वस्तु का आईडी डिफ़ॉल्ट रूप से इस समस्या का समाधान हो। इस कोड को अपने मॉडल में डालकर, आप ActiveRecord डिफ़ॉल्ट को ओवरराइट कर रहे हैं, इसलिए जब आप किसी उपयोगकर्ता से लिंक करते हैं, तो यह id के बजाय पैरामीटर के लिए username का उपयोग करेगा।

17

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

class User < ActiveRecord::Base 
    def to_param 
    username 
    end 
end 

बजाय अब आप User.find(params[:id]) का उपयोग कर के अपने नियंत्रक में User.find_by_username(params[:id])

+1

बेहतर होगा: मार्गों च में username' इले? क्योंकि परम को अब 'आईडी' नहीं कहा जाना चाहिए, लेकिन इसके बजाय इसे 'उपयोगकर्ता नाम' कहा जाना चाहिए –

0

उपयोग करने की आवश्यकता आप to_param ओवरराइड करने के लिए यदि आप, तो आप सिर्फ इस तरह के फार्म टैग में निर्दिष्ट कर सकते हैं नहीं करना चाहती नहीं है :

<%= form_for @user, :url => user_path(:id => @user.username) do |f|%>