2011-03-24 4 views
13

मैं एक ऐसी प्रणाली बनाने की कोशिश कर रहा हूं जहां उपयोगकर्ता केवल उन लेखों को देख सके जो उन्होंने लिखा था।रेल में कुछ भी रिटर्न मिलने पर मैं एक त्रुटि कैसे छोड़ सकता हूं?

लेख नियंत्रक में, मैं लाइन

@article = current_user.articles.find(params[:id]) 

नीचे डाल जहां पैरामीटर [: id] एक article_id है।

मैं सिर्फ यह जानना चाहता हूं कि मैं त्रुटि को प्रदर्शित करने से कैसे रोक सकता हूं और केवल उस पर रीडायरेक्ट कर सकता हूं: अगर आलेख मौजूद नहीं है, तो सूचकांक कार्रवाई, या यदि उपयोगकर्ता को इसे देखने की अनुमति नहीं है। मैंने @ article.nil डाल दिया? उपरोक्त स्टेटमेंट स्टेटमेंट के बाद सशर्त कथन, लेकिन ऐसा लगता है कि उपरोक्त खोज विवरण नीचे की तरह त्रुटि उत्पन्न करता है।

आईडी = 1662 के साथ अनुच्छेद नहीं मिल सका [कहां (articles .user_id = 1)]

मैं कैसे इस समस्या को हल कर सकते हैं?

+0

[इस सवाल] (http://stackoverflow.com/questions/4966430/model-find1-gives-activerecord-error-when से संबंधित प्रतीत हो रहा है -आईडी -1-अस्तित्व में नहीं है) – rubyprince

उत्तर

21

ActiveRecord :: Base.find हमेशा एक अपवाद फेंकता है अगर उसे रिकॉर्ड नहीं मिलता है, तो यह जानबूझकर है। आपको केवल find का उपयोग करना चाहिए यदि आप पूरी तरह से जो कुछ भी ढूंढ रहे हैं उसकी अपेक्षा करते हैं। यदि आप शो एक्शन प्रस्तुत कर रहे हैं और लेख नहीं ढूंढ पा रहे हैं, तो आपको उस अपवाद को बचाया जाना चाहिए और इंडेक्स (तकनीकी रूप से) पर रीडायरेक्ट करने के बजाय 404 (नहीं मिला) प्रस्तुत करना चाहिए।

यदि आप अपवाद को मजबूर किए बिना id विशेषता से कुछ खोजना चाहते हैं, तो गतिशील खोजक find_by_id का उपयोग करें जो झूठी वापसी करेगा यदि उसे उस आईडी के साथ रिकॉर्ड नहीं मिलता है।

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

गतिशील ढूँढ़ने वाले अब एक अलग हस्ताक्षर है, find_by_id अब होना चाहिए:

find_by :id, id_to_find

देखें नई Rails Guide on Querying

+0

मैं इस प्रश्न पूछे जाने पर 'find_by' के बजाय – Anton

+0

' find_by' मौजूद नहीं था। हालांकि मैंने मार्गदर्शिका और गतिशील खोजकर्ता अनुभाग में एक लिंक जोड़ा था। –

1

खोज() प्रणाली RecordNotFound को जन्म देती है अपवाद, जबकि find_by_id जैसी विधियां शून्य मान लौटाएंगी। तो अगर आप कुछ विकल्प आप एक शुरू/बचाव के साथ में अपने विधि कॉल लपेट कर सकते हैं, अपने नियंत्रक करने के लिए एक rescue_from खंड जोड़ें:

rescue_from(ActiveRecord::RecordNotFound) {|e| do something here } 

या एक find_by_id विधि का उपयोग करें और स्थिति है, जिसमें शून्य दिया जाता है संभाल।

वास्तव में कई अन्य विकल्प हैं, लेकिन ऊपर वाले लोग अच्छी शुरुआत कर रहे हैं, find_by_id शायद सबसे आसान है।

4

आपको find_by_id या question में दिए गए किसी भी तरीके का उपयोग करना चाहिए।

2

ऐसा इसलिए है क्योंकि ActiveRecord ढूंढने का तरीका एक अपवाद उठाता है जब उसे कोई विशिष्ट आईडी नहीं मिलती है। आप इस के कुछ तरीके हल कर सकते हैं, सबसे अच्छा तरीका

begin 
    @article = current_user.articles.find(params[:id]) 
rescue 
    redirect_to articles_path 
end 
संबंधित मुद्दे