2012-12-30 32 views
5

में नेस्टेड संसाधनों और प्रमाणीकरण के बारे में उलझन में देखते हैं कि मैं अपने संदेहों के बारे में खुद को पर्याप्त समझा सकता हूं या नहीं।रेल

मेरे पास एक उपयोगकर्ता मॉडल है जो डेविस द्वारा प्रबंधित किया जाता है। तो मेरी मार्गों में मेरे पास है:

devise_for :users 

उपयोगकर्ता मॉडल में, मैं मॉडल योजना के साथ जुड़ाव है। एसोसिएशन है:

User has_many Plans 
Plan belongs_to User 

इस बिंदु मैं भी योजना मॉडल के लिए एक संसाधन है पर, इसलिए मैं सभी योजनाओं प्राप्त कर सके, एक विशेष योजना दिखाने के और इतने पर। लेकिन मैं आगे जाना चाहता हूं।

मैं किसी विशेष उपयोगकर्ता की योजनाओं को देखने में सक्षम होना चाहता हूं और किसी विशेष उपयोगकर्ता को अपनी योजनाएं देखने और उन्हें संपादित करने देना चाहता हूं।

तो, उदाहरण के लिए, जब भी मैं इस पर जाएं:

/उपयोगकर्ताओं /: id/योजना बना रही है

मुझे लगता है कि विशेष रूप से के लिए योजनाओं को देखने के लिए सक्षम होना चाहते हैं: आईडी उपयोगकर्ता। और यदि वह यूआरएल उस यूआरएल पर जा रहा है जो लॉग इन है, तो मैं चाहता हूं कि वह उन योजनाओं को संपादित करने में सक्षम हो।

मैं इस व्यवहार को कैसे प्रबंधित कर सकता हूं? क्या वहां कोई मणि है जो इसके साथ मदद करता है?

resources :users do 
    resources :plans, only: [:index] 
end 

resources :plans, except: [:index] 

मैं इस /users/:user_id/plans तरह resources :plansresources :users के अंदर इस्तेमाल मार्ग के लिए: या मैं अगर current_user कह विचारों में सशर्त, ऐसा करने के लिए आप इस तरह अपने मार्गों बना सकते हैं की जरूरत है ...

उत्तर

4

के मार्गों के साथ शुरू करते हैं, , जबकि resources :plans बाहर के बाकी कार्यों (संपादित, नष्ट, ...) के लिए है, जिसके लिए user_id की आवश्यकता नहीं है, यानी, एक अद्वितीय आईडी द्वारा एक योजना की पहचान की जाती है, इसलिए आपको इसे लाने के लिए user_id की आवश्यकता नहीं है संपादन या नष्ट करने के लिए डीबी से।

अब नियंत्रक के लिए, हम इसे इस तरह से कर सकते हैं:

class PlansController < ApplicationController 
    before_filter :is_plan_owner?, only: [:edit, :update] 

    def index 
    @plans = Plan.where(:user_id => params[:user_id]) 
    end 

    def edit 
    @plan = Plan.find(params[:id]) 
    end 

    private 

    def is_plan_owner? 
    if current_user != Plan.find(params[:id]).user 
     # Scream, shout, call 911 and/or redirect else where 
    end 
    end 
end 
4

यह किसी अन्य नेस्टेड संसाधन का उपयोग कर से अलग नहीं है। routes.rb फ़ाइल में devise_for पर कॉल उपयोगकर्ता मॉडल को रीस्टफुल रूटिंग प्रदान नहीं करता है। एक मानक डिवाइसेज इंस्टॉल के साथ, एक मिनट के लिए नेस्टेड संसाधन के बिना इसके बारे में सोचें। यदि आप rake routes के लिए गए थे आप के लिए कुछ इसी तरह मिलेगा निम्नलिखित:

new_user_session GET /users/sign_in(.:format)  devise/sessions#new 
     user_session POST /users/sign_in(.:format)  devise/sessions#create 
    user_password POST /users/password(.:format)  devise/passwords#create 
new_user_password GET /users/password/new(.:format) devise/passwords#new 
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit 
      sign_in GET /sign_in(.:format)    devise/sessions#new 

यह तो आप अभी भी उस के लिए मार्गों को जोड़ने के लिए की आवश्यकता होगी, अनुक्रमण या दिखा उपयोगकर्ताओं के लिए कुछ भी नहीं प्रदान करता है: आप

resources :users, only: [:index, :show] 

अब मिलती है:

users GET /users(.:format)  users#index 
user GET /users/:id(.:format) users#show 

ठीक है, अब हम कहीं न कहीं हो रही है, तो यह बस नेस्टेड संसाधन जोड़ने है, यह सब करते हुए वसीयत यह कोई मन का भुगतान करती है।

resources :users, only: [:index, :show] do 
    resources :plans 
end 

जो तुम साधन संपन्न मार्ग देता है आप

user_plans GET /users/:user_id/plans(.:format)   plans#index 
       POST /users/:user_id/plans(.:format)   plans#create 
new_user_plan GET /users/:user_id/plans/new(.:format)  plans#new 
edit_user_plan GET /users/:user_id/plans/:id/edit(.:format) plans#edit 
    user_plan GET /users/:user_id/plans/:id(.:format)  plans#show 
       PUT /users/:user_id/plans/:id(.:format)  plans#update 
      DELETE /users/:user_id/plans/:id(.:format)  plans#destroy 

की इच्छा और वह वास्तव में इसके लिए बस इतना ही है। देवता इस पर आपके रास्ते से बाहर रहता है।