2012-03-06 5 views
7

मेरे ऐप में, मैं कभी-कभी फ्लाई पर उपयोगकर्ता बनाता हूं, और उपयोगकर्ता का ईमेल मान्य प्रारूप होना चाहिए , और अद्वितीय हो।रेल 3.1: ऐप ActiveRecord :: RecordInvalid के लिए अलग-अलग कारणों को कैसे संभाल सकता है (उदाहरण के लिए, डुप्लिकेट बनाम सत्यापन त्रुटि)

मैं किस सत्यापन के कारण त्रुटि उत्पन्न करने के कारण विभिन्न स्थानों पर रीडायरेक्ट करना चाहता हूं: अवैध प्रारूप बनाम डुप्लिकेट।

मेरी कोड में मैं

begin 
     user.save! 
     flash[:notice] = "Created new user #{email} with password #{password}" 

    rescue ActiveRecord::RecordInvalid => e 
     flash[:alert] = "Failed to create account because #{e.message}" 
     redirect_to SOMEPLACE 
    end 

है ईमेल (जैसे कि "उपयोगकर्ता उदाहरण @" के रूप में) अवैध स्वरूप e.message है "सत्यापन विफल: ईमेल अमान्य है" है

ईमेल हैं तालिका में पहले से मौजूद है, e.message "प्रमाणीकरण विफल रहा है: ईमेल पहले से ही लिया जा चुका है"

मुझे कारण निर्धारित करने के लिए e.message टेक्स्ट को पार्स करने के विचार से नफरत है ... क्या बचाव हैंडलर के लिए एक बेहतर तरीका है अंतर्निहित कारण का पता लगाने के लिए एक ActiveRecord :: RecordInvalid अपवाद डब्ल्यू फेंक दिया गया?

पीएस मुझे इस उदाहरण में पता है कि मैं बचत करने से पहले पहले से मौजूद ईमेल के लिए आगे की जांच कर सकता हूं, लेकिन मैं एक ही अपवाद फेंकने वाली अलग-अलग सत्यापन विफलताओं पर पहचान और अभिनय के सामान्य समाधान को समझने की कोशिश कर रहा हूं।

+1

दरअसल वास्तव में पहले से मौजूद ईमेल के लिए आगे की जांच नहीं कर सकता है, ActiveRecord की विशिष्टता सत्यापन दौड़ की स्थिति के अधीन हैं और डिज़ाइन द्वारा विभाजित हैं। आपके डेटाबेस के अंदर एक विशिष्टता बाधा होनी चाहिए और आपको टी तैयार होना चाहिए o अपवाद के साथ सौदा करें कि यह उठाएगा (या तो 'सेव' या 'सेव!' से)। –

उत्तर

1

यह करने के लिए मानक रेल रास्ता धमाके ऑपरेटर, जो एक अपवाद को जन्म देती है उपयोग करने के लिए नहीं है, लेकिन विधि को बचाने मानक का उपयोग करें और जांच करने के लिए है कि क्या यह लौटे है सही या गलत:

if @user.save 
    flash[:notice] = "User created." 
    redirect_to :action => :index 
else 
    flash[:alert] = "User could not be created." 
    render :action => :new 
end 

और अपनी उपयोगकर्ता निर्माण दृश्य:

<% if @user.errors.any? %> 
    <ul> 
    <% @user.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
    <% end %> 
    </ul> 
<% end %> 
+0

लेकिन यह आपको नहीं बताता कि बचत विफल क्यों हुई। यदि आपके डेटाबेस के अंदर एक अनूठी बाधा है (जो आपको एआर की विशिष्टता सत्यापन के रूप में दौड़ की स्थितियों के अधीन होना चाहिए) तो आपके पास 'x.valid? 'सत्य हो सकता है लेकिन दोनों' x.save' और' x.save! 'कर सकते हैं अपवाद बढ़ाएं क्योंकि डेटाबेस की बाधा का उल्लंघन किया गया था। –

0

मैं समझ रहा हूँ आप सही तरीके से एक तरह से यह करने के लिए सिर्फ क्षेत्र स्तर पर एक त्रुटि की उपस्थिति के खिलाफ बात पर जोर देना होगा करने के लिए, कोशिश कर रहे हैं तो। जैसे

if user.errors[:field_name].present? 
    redirect_to path_for_field_name_error 
end 

वैकल्पिक रूप से, आप जहां एक निरंतर (REDIRECT_PATHS जैसे जिस स्थिति में आप की तरह कुछ के साथ अंत के रूप में खेतों क्या अनुप्रेषित के कुछ मानचित्रण परिभाषित:

redirect_to REDIRECT_PATHS[field_name] if user.errors[:field_name].present? 

जहां आप कर सकते हैं बस field_name रों पाश

+0

मेरे उदाहरण में, एक ही फ़ील्ड के लिए कई त्रुटियां हो सकती हैं ईमेल पता अमान्य हो सकता है, या उदाहरण के लिए पहले से ही उपयोग किया जा सकता है। – jpwynn

+0

के। यदि आप किसी भी तरह से ActiveRecord बिल्ट-इन्स का उपयोग उन सभी चीज़ों को संभालने के लिए कर सकते हैं जो इस डीबी-संचालित विशिष्टता बाधा नहीं हैं (जो @mu बहुत छोटा सही ढंग से इंगित करता है हमेशा अपेक्षित काम नहीं करता है), तो आप बस जांच सकते हैं 'अलिद' के खिलाफ? और इस विशिष्टता बाधा को छोड़कर, इस तरह की त्रुटियों को छील दें। बेशक, यदि आपके पास अन्य क्षेत्रों पर कई बाधाएं हैं, तो यह अभी भी एक मुद्दा है और स्ट्रिंग पार्सिंग पर वापस आ जाता है। शुभकामनाएं, उम्मीद है कि यह सहायक है? –

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