2011-07-25 22 views
6

मेरी कार्रवाई संपादित में रूबी में हैंडलिंग ActiveRecord :: RecordNotFound, मेरे पासऑन रेल्स

@item = current_user.shop.items.find(params[:id]) 

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

इस तरह की स्थितियों में इस त्रुटि को संभालने का सबसे अच्छा तरीका क्या है? क्या मुझे अपवाद उठाना चाहिए? क्या मुझे कहीं रीडायरेक्ट करना चाहिए और फ़्लैश सेट करना चाहिए (यदि हां, तो मैं इसे कैसे कर सकता हूं), क्या मुझे इसे छोड़ देना चाहिए? किसी भी सलाह की सराहना की है। @Koraktor के समाधान के लिए

rescue_from ActiveRecord::RecordNotFound do 
    flash[:notice] = 'The object you tried to access does not exist' 
    render :not_found # or e.g. redirect_to :action => :index 
end 

उत्तर

20

अपने नियंत्रक के लिए निम्न की तरह कुछ जोड़ें। यदि आप ActiveRecord :: RecordNotFound से बचना चाहते हैं, तो आप खोजने के बजाय find_by विधि का उपयोग कर सकते हैं। जबकि टेम्पलेट प्रतिपादन

@item = current_user.shop.items.find_by_id(params[:id]) 
if @item.nil? 
    flash[:error] = "Item not found" 
else 
    # Process the @item... 
end 
+0

बहुत बढ़िया उत्तर, धन्यवाद मुझे बहुत मदद करता है। – SSR

4

इसके अतिरिक्त आप http स्थिति स्थापित करना चाहिए:

rescue_from ActiveRecord::RecordNotFound do 
    render :not_found, :status => :not_found 
end 

चेक Rails guide स्थिति सूची के लिए (खंड 2.2.13.4)।

जैसा कि कहीं और कहा गया है (उदाहरण के लिए here) 40x स्थिति भेजते समय आपको कभी भी पुनर्निर्देशन नहीं करना चाहिए, केवल 30x स्थितियों को पुनर्निर्देशन की अनुमति देनी चाहिए। इसलिए जब भी आप किसी रीडायरेक्ट को: not_found स्थिति के साथ रीडायरेक्ट करने का प्रयास करते हैं तो आपको एक अजीब "आप रीडायरेक्ट किया जा रहा है" पृष्ठ का सामना करना पड़ सकता है।

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