18

मैं एक विलक्षण नेस्टेड प्रोफ़ाइल संसाधन के साथ एक सरल उपयोगकर्ता मॉडल है तो मेरी routes.rb में मेरे पास है:रेल नेस्टेड एकवचन संसाधन रूटिंग

edit_user_profile GET /users/:user_id/profile/edit(.:format) {:action=>"edit", :controller=>"profiles"} 
    user_profile GET /users/:user_id/profile(.:format)  {:action=>"show", :controller=>"profiles"} 
    user_profile PUT /users/:user_id/profile(.:format)  {:action=>"update", :controller=>"profiles"} 

मैं:

resources :users do 
    resource :profile, :only => [:edit, :update, :show] 
end 

यह उम्मीद मार्गों उत्पन्न करता है हमने एक सरल नियंत्रक अद्यतन विधि बनाई है जो मॉडल को अद्यतन करता है और फिर सफल अद्यतन पर पुनर्निर्देशित करता है:

def update 
    @profile = Profile.find_by_user_id(params[:user_id]) 
    @user = User.find_by_id(params[:user_id]) 

    respond_to do |format| 
    if @profile.update_attributes(params[:profile]) 
     format.html { redirect_to(user_profile_path(@user, @profile), :notice => 'Profile was successfully updated.') } 
    else 
     # ... 
    end 
    end 
end 

समस्या यह है कि फ़ॉर्म जमा होने के बाद, फॉर्म mydomain.com/users/4/profile.22 पर रीडायरेक्ट करता है जहां 22 प्रोफ़ाइल की आईडी होती है। स्पष्ट रूप से यह नियंत्रकों को भ्रमित करता है क्योंकि रूटिंग प्रारूप के रूप में '22' को व्याख्या करती है।

मेरा प्रश्न, कैसे मैं इस बजाय mydomain.com/users/4/profile को अनुप्रेषित करने के लिए मिलता है? मैं कोई प्रभाव नहीं करने के लिए redirect_to स्टेटमेंट पर निम्न रूपों की कोशिश की है, वे एक ही गलत url में सभी परिणाम:

redirect_to(user_profile_path(@user), ...) 
redirect_to(user_profile_path(@user, @profile), ...) 
redirect_to([@user, @profile], ...) 
redirect_to(@profile, ...) 

इतना ही नहीं, का उपयोग करते हुए 'user_profile_path (@user)' कहीं और सही यूआरएल पैदा करता है।

कोई विचार? ओह, और मैं रेल 3.0.0 और रूबी 1.9.2 का उपयोग कर रहा हूं अगर यह मदद करता है।

उत्तर

11

चारों ओर देखने के बाद, ऐसा प्रतीत होता है कि अद्यतन उत्पन्न करने वाला फ़ॉर्म गलत यूआरएल था।

form_for [@user, @profile] do |f| ... 

यह (ऊपर हमलावर फार्म के) गलत यूआरएल के लिए प्रपत्र कार्रवाई की वजह से: किसी को भी इस मुद्दे को देख रहा है, तो यह क्योंकि मैं अपने फार्म के रूप में स्थापित किया था निर्भर है। इसके बजाय, मैं

form_for @profile, :url => user_profile_path(@user) do |f| ... 

इस्तेमाल किया और सब कुछ काम करने के लिए लग रहा था।

+3

मुझे यह समस्या भी है।रूटिंग यह जानकर काफी समझदार होनी चाहिए कि यह @profile से निपट रहा है जो एकवचन है और आईडी को यूआरएल में नहीं डालता है। मुझे उम्मीद है कि इस के आसपास काम करने का एक तरीका है क्योंकि मैं पॉलिमॉर्फिक यूआरएल के ज़रूरत से बाहर हूं क्योंकि मुझे नहीं पता कि मूल वस्तु में से कौन सा वर्ग है (आपके मामले में मुझे नहीं पता कि @user जरूरी है उपयोगकर्ता वर्ग)। –

+0

यह एक लंबा स्टंटिंग है [रेल में बग] (https://github.com/rails/rails/issues/1769) –

0

user_profile_path(@user) सही होना चाहिए। आप सुनिश्चित हैं कि कोई mydomain.com/users/4/profile.22 लौटा रहा है?

+0

हाँ, पर सिर्फ दोबारा जांच के साथ मैं ('/ उपयोगकर्ताओं/4/प्रोफाइल'), यहां तक ​​कि बहुत अगली पंक्ति हालांकि, रीडायरेक्ट रीडायरेक्ट करने से पहले और कहा कि सही पथ मुद्रित में एक 'कहते हैं' बयान जोड़ा सटीक उसी कोड ने मुझे पहले उल्लिखित गलत यूआरएल में भेजा है। –

+0

'tail -f' आपकी लॉग फ़ाइल। शायद यह एक से अधिक रीडायरेक्ट कर रहा है। सिर्फ एक उभाड़! – scragz

4

आप (@user) user_profile_path करने के बाद के रूप में अपने मार्गों रीडायरेक्ट करना चाहिए कहते हैं कि यह है:

/users/:user_id/profile(.:format) 

तुम करीब से इस पर गौर करते हैं तो आप देखेंगे, केवल यह है कि: user_id पैरामीटर की जरूरत है, तू यह केवल पथ में @user है।

/users/:user_id/profile/:id(.:format) 

यदि आप संसाधन * रों * था यह सही होगा: अपने routes.rb में प्रोफाइल, तो साथ ही आप अपने उदाहरण के रूप में अपना रास्ता इस्तेमाल कर सकते हैं।

+1

मुझे 100% यकीन है कि आपको user_profile_path (@user) का उपयोग करना होगा। – m4risU

+0

रेल में यदि आप डबल रीडायरेक्ट करते हैं, तो आप इसे जोर से रो रही होगी! ^^ "हो सकता है कि आपने कुछ और छोड़ा हो। आपका वर्तमान नियंत्रक कोड क्या है? – m4risU