5

क्षमा करें यदि प्रश्न स्पष्ट है, तो मैं केवल रेल के साथ काम करना शुरू कर रहा हूं।
मैं अब कई नियंत्रक तरीकों में एक निम्न कोड:रेल न्यूबी: नियंत्रक में त्रुटि प्रबंधन के लिए सिफारिशें

respond_to do |format| 
    if @project.save 
     format.html { redirect_to(edit_project_url(@project), :notice => '#{user.name} added to #{role}.') } 
     format.js 
    else 
     format.html { render :action => "edit" } 
     format.js #... 
    end 
end 

तो सवाल है, क्या सभी तरीकों में त्रुटियों के लिए एक ही बात करने का सबसे अच्छा तरीका है?
क्या यह अनुशंसा की जाती है कि मैं save! का उपयोग करें और इसे rescue_action में संभाल लें?

या मुझे अपना खुद का respond विधि करना चाहिए और एक ब्लॉक में save पास करना चाहिए?

उत्तर

16

सहेजने और बचाव के अपवाद-बढ़ाने वाले संस्करण का उपयोग करना अक्सर सुविधाजनक होता है जो बाद में ब्लॉक की तुलना में ब्लॉक में होता है। अपवादों का लाभ यह है कि वे लेनदेन से बाहर निकल जाएंगे।

def create 
    @project.save! 

    respond_to do |format| 
    format.html { redirect_to(edit_project_url(@project), :notice => '#{user.name} added to #{role}.') } 
    format.js 
    end 

rescue ActiveRecord::RecordInvalid 
    respond_to do |format| 
    format.html { render :action => "edit" } 
    format.js #... 
    end 
end 

आपको लगता है कि यह नेस्टेड if बयान के ढेर से बाहर अपना रास्ता लड़ाई के लिए जब एक समय में एक से अधिक वस्तु को बचाने की कोशिश वास्तव में मुश्किल हो जाता है मिल जाएगा, लेकिन अपवाद के लिए एक सरल rescue यह बड़े करीने से संभाल लेंगे ।

def create 
    Project.transaction do 
    @project.save! 
    @something_else.save! 
    @other_stuff.save! 
    end 

    # ... 
rescue ActiveRecord::RecordInvalid 
    # ... 
end 

यदि इनमें से कोई भी बचाता है तो आपको अपवाद मिलेगा। यह सुनिश्चित करने के लिए कि वे सभी सत्यापन त्रुटियों को प्रदर्शित कर रहे हैं, आपको प्रत्येक को प्राइम करने के लिए .valid? पर कॉल करना पड़ सकता है या विफलता के बाद उन लोगों को अनचाहे छोड़ दिया जाएगा।

+0

यह एक अच्छा विचार लगता है, लेकिन क्यों पाड़ इस तरह से जाना नहीं है? मुझे लगता है कि अगर ऐसी कई विधियां हैं तो आप 'rescue_action' का उपयोग करने की सलाह देते हैं? –

+0

ठीक है, मुझे लगता है कि आप कई विधियों के लिए 'rescue_from' या' save_action_in_public' हैंडलर 'का अर्थ मानने जा रहे हैं, इस मामले में चुब्स का उत्तर यहां एक सबसेट है और मुझे इसे एक उत्तर के रूप में स्वीकार करना चाहिए। –

+0

एक सामान्य नियम के रूप में मैं उन चीज़ों के लिए 'save_from' का उपयोग करता हूं जिन्हें आसानी से पुनर्प्राप्त नहीं किया जा सकता है, और' बचाव 'जब मैं इसे संभाल सकता हूं। जब कोई 'create' विफल रहता है, तो आमतौर पर आप फिर से' नया 'फ़ॉर्म प्रस्तुत करते हैं। कुछ और सार आम तौर पर एक सुंदर "उह ओह" पृष्ठ देता है। – tadman

3

if @object.save पैटर्न का उपयोग करना एक बुरी बात नहीं है। हालांकि, अगर आप अपने कंट्रोलर पर अपने सभी कार्यों के लिए बिल्कुल वही कर रहे हैं, तो आप rescue_from एक्शन को परिभाषित कर सकते हैं।

Something like

class MyController < ActionController::Base 
    rescue_from ActiveRecord::RecordInvalid do 
    render :action => edit 
    end 
end 
+0

हाँ, यह मेरे विकल्पों में से एक था, लेकिन इस तरह की जरूरतों को '! 'संस्करण है, है ना? क्या आपको पता है कि क्यों मचान डिफ़ॉल्ट रूप से इस तरह से नहीं जाता है? यह मेरे लिए बेहतर लगता है। –

+0

आपका और @ टाडमैन दोनों एक-दूसरे के पूरक होने लगते हैं, इसलिए अगर मैं कर सकता तो मैं दोनों को स्वीकार करूँगा, लेकिन दुर्भाग्य से मुझे एक चुनना पड़ा। –

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