2009-04-07 8 views
7

रेल ऐप पर रूबी में किसी ऑब्जेक्ट के लिए "बनाएं" विधि लिखते समय, मैंने दो विधियों का उपयोग किया है। मैं क्लीनर और अधिक संगत कोड के लिए एक विधि का उपयोग करना चाहता हूं। मैं नीचे दो विधियों की सूची दूंगा। क्या किसी को पता है कि कोई दूसरे से बेहतर है? यदि हां, तो क्यों?रूबी पर रूबी में कोई ऑब्जेक्ट बनाते समय, आप किस प्रकार की बचत को प्राथमिकता देते हैं, और क्यों?

विधि 1:

def create1 
    # is this unsecure? should we grab user_id from the session 
    params[:venue]['user_id'] = params[:user_id] 

    begin 
    venue = Venue.create(params[:venue]) 
    @user_venues = @user.venues 
    render :partial => 'venue_select_box', :success => true, :status => :ok 
    rescue ActiveRecord::RecordInvalid 
    render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity 
    end 
end 

विधि 2:

def create2 
    # is this unsecure? should we grab user_id from the session 
    params[:venue]['user_id'] = params[:user_id] 

    venue = Venue.new(params[:venue]) 
    if venue.save 
    @user_venues = @user.venues 
    render :partial => 'venue_select_box', :success => true, :status => :ok 
    else 
    render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity 
    end 
end 
+0

मुझे लगता है कि आपका मतलब है "बनाएं!" विधि 1 में "बनाएं" नहीं। "बनाएं" अपवाद नहीं उठाएगा; यह केवल सत्यापन त्रुटियों पर झूठी वापसी करता है। –

+0

आप सही हैं, – Tony

उत्तर

4
class VenuesController < ApplicationController 
    def create 
    @venue = @user.venues.create!(params[:venue]) 
    render :partial => 'venue_select_box', :success => true, :status => :ok 
    end 

    rescue_from ActiveRecord::RecordInvalid do 
    render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity 
    end 
end 

@user.venues का उपयोग करते हुए इस तरह से यह सुनिश्चित करें कि यूजर आईडी हमेशा उचित रूप से स्थापित किया जाएगा। इसके अतिरिक्त, ActiveRecord #create! कॉल के दौरान असाइनमेंट से :user_id फ़ील्ड की रक्षा करेगा। इसलिए, बाहर से हमले :user_id को संशोधित करने में सक्षम नहीं होंगे।

अपने परीक्षणों में, आप यह सत्यापित कर सकते हैं कि पोस्ट करने के लिए: एक ActiveRecord :: RecordInvalid अपवाद उठाता है।

+0

अराजकता बिंदु पर मान्य सोच रहा था कि, "नियमित परिस्थितियों के लिए अपवादों का उपयोग नहीं किया जाना चाहिए" एक अच्छा है। फिर भी रेल ने अन्यथा निर्णय लिया है: "ActiveRecord :: RecordInvalid" से बचाव = सामान्य अभ्यास है। –

3

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

2

यह निर्भर करता है। यदि आप सभी निर्माण बयानों को काम करने की उम्मीद करते हैं, तो पूर्व का उपयोग करें, क्योंकि बनाने और सहेजने में विफलता असाधारण है, और संभवतः ऐसी स्थिति हो सकती है जिससे प्रोग्राम आसानी से ठीक नहीं हो सके। साथ ही, यदि आप रिलेशनल अखंडता (रेडहिल कंसल्टिंग द्वारा विदेशी_की_मिग्रेशन) का उपयोग करते हैं, तो यह विदेशी कुंजी उल्लंघनों पर अपवाद फेंक देगा, इसलिए शायद आप उन्हें बनाते या अपडेट करते समय पकड़ना चाहते हैं।

दूसरा काम करने योग्य है, और यदि क्वेरी सफल नहीं होती है तो वह अच्छा है जो आप उस विशेष कार्रवाई के दिन-प्रतिदिन के संचालन के हिस्से के रूप में अपेक्षा करते हैं।

इसके अलावा, सत्र के बारे में आपकी कोड टिप्पणी असुरक्षित है - सत्र उपयोगकर्ता_आईडी डालने का स्थान है। जब तक आप यह सत्यापित करने के लिए जांच कर रहे हैं कि उपयोगकर्ता को कुछ और करने से पहले प्रमाणित किया गया है, तो आप ठीक रहेगा।

+0

को इंगित करने के लिए धन्यवाद, चूंकि यह एक निर्माण कार्य है, क्या आप कह रहे हैं कि क्लाइंट साइड सत्यापन होने पर संस्करण 1 अच्छा है, लेकिन यदि मैं सर्वर साइड सत्यापन का उपयोग कर रहा हूं तो संस्करण 2 बेहतर है? – Tony

+0

कुछ अपवादों के साथ, आप हमेशा * सुरक्षा सावधानी के रूप में सर्वर-साइड पर मान्य करना चाहते हैं (क्लाइंट-साइड सत्यापन हमेशा दुर्भावनापूर्ण हमलावर द्वारा अक्षम किया जा सकता है) ... (दो टिप्पणियों में विभाजित) –

+0

अंगूठे का मेरा नियम, क्या मैं सहेजता हूं() जब मैं उम्मीद करता हूं कि ऑपरेशन डीबी बाधा में भाग दिए बिना पूरा होने की संभावना है, और जब (मुझे उम्मीद है कि यह हो सकता है ...) क्या यह मदद करता है? मैं भटक त्रुटियों को पकड़ने के लिए हमेशा एक वैश्विक अपवाद हैंडलर भी लागू करता हूं। –

1

मैं पूरी तरह से डॉन की टिप्पणी से सहमत हूं। लेकिन मैं user_id भाग के साथ एक कदम आगे भी जाऊंगा और इसे मॉडल पर पहले फ़िल्टर के रूप में सेट कर दूंगा।

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