2011-01-05 16 views
12

मैं नियंत्रक में ActiveRecord::RecordNotUnique अपवाद कैसे संभाल सकता हूं? धन्यवादरेल 3: हैंडल ActiveRecord :: RecordNotUnique अपवाद

संपादित करें: एक अद्वितीय कोड उत्पन्न करते समय मुझे यह अपवाद मिल रहा है। मैं application_controller.rb में अपवाद को संभाल सकता हूं लेकिन जो भी मैं वास्तव में चाहता हूं वह फिर से उत्पन्न होने के लिए कोड है और यह नियंत्रक में किया जाना चाहिए।

generate_code 
@couponcode = Couponcode.new(:user_id => current_user.id, :code => @code) 

EDIT2:

generate_code 

begin 
    @couponcode = Couponcode.new(:user_id => current_user.id, :code => @code) 
rescue ActiveRecord::RecordNotUnique 
    #generate_code 
    @code = "111-11111" 
    @couponcode = Couponcode.new(:user_id => current_user.id, :code => @code)   
end 
+0

शायद थोड़ा और कोड देखना चाहिए? मुझे लगता है कि रिकॉर्ड को सहेजने का प्रयास करते समय आपको वह अपवाद मिल रहा है और वह हिस्सा आपके उदाहरण में शामिल नहीं है। – Heikki

+0

हां, यह सही है। धन्यवाद। – donald

उत्तर

21
begin 
    # do stuff 
rescue ActiveRecord::RecordNotUnique 
    # handle the exception however you want to 
end 

http://ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html

तुम भी rescue_from इस्तेमाल कर सकते हैं यदि आप उसका अक्सर से निपटने के लिए की जरूरत है।

+0

मैंने प्रश्न को नए कोड के साथ संपादित किया है। मैंने बचाव और साथ में @ कूपनकोड के बिना कोशिश की है। त्रुटि अभी भी वही है, अभी भी अपवाद नहीं किया जा रहा अपवाद है। – donald

+0

क्या आप सुनिश्चित हैं कि त्रुटि '.new' लाइन से आ रही है और जहां 'save' कहलाता है? [ActiveRecord :: RecordNotUnique] के लिए दस्तावेज़ (http://api.rubyonrails.org/classes/ActiveRecord/RecordNotUnique.html) सुझाव देते हैं कि रिकॉर्ड को डेटाबेस में सहेजा जाने पर उठाया जाएगा। किसी भी मामले में, एक बचाव ब्लॉक में बहुत कुछ करने की कोशिश कर रहा है लंबे समय तक दर्द का कारण बन रहा है। यदि आप किसी उपयोगकर्ता दृष्टिकोण से त्रुटि की अपेक्षा कर रहे हैं, तो आपको इसके साथ अधिक सावधानीपूर्वक निपटने की आवश्यकता है (जैसे सत्यापन और फ़ॉर्म त्रुटियों का उपयोग करना)। – idlefingers

+0

यदि आप त्रुटि की अपेक्षा नहीं कर रहे हैं, लेकिन यह बहुत कुछ हो रहा है, तो आपको समस्या की जड़ तक पहुंचने की कोशिश करनी चाहिए, न कि इसे दबाएं। डबल टिप्पणी के लिए खेद है, तो टिप्पणी लंबाई सीमा! :) – idlefingers

1

आप एक विशिष्टता सत्यापन जोड़ सकते हैं और अभी भी बचाव का उपयोग किए बिना कोड को बदलने का मौका है।

couponcode.rb

validates_uniqueness_of :code 

नियंत्रक:

@couponcode = Couponcode.new(:user_id => current_user.id) 
begin 
    couponcode.code = generate_code 
    # might want to break out after a limit here 
end until @couponcode.valid? 
@couponcode.save 

लेकिन आप भी एक UUID इस्तेमाल कर सकते हैं और यह एक जाँच के बिना अद्वितीय होगा।

4

इस सत्यापन विधि का उपयोग validate_uniqueness_of डुप्लिकेट रिकॉर्ड सम्मिलन की अनुपस्थिति की गारंटी नहीं देता है।

आपको here

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