2011-03-01 8 views
12

मैं उन उदाहरणों को देखता हूं जहां कोडर ने Proc.new का उपयोग करना चुना, जब प्रतीत होता है कि यह अनावश्यक और अवांछित दोनों है।रेल कॉलबैक में किसी विधि को कॉल करने के लिए Proc.new का उपयोग क्यों करें? RoR के लिए सभी ट्यूटोरियल में

class Order < ActiveRecord::Base 
    before_save :normalize_card_number, 
    :if => Proc.new { |order| order.paid_with_card? } 
end 

class Order < ActiveRecord::Base 
    before_save :normalize_card_number, :if => "paid_with_card?" 
end 

तो क्या फर्क है:

उदाहरण के लिए, यहाँ एक कॉलबैक के लिए एक मॉडल में रखा, एक Proc.new का उपयोग अन्य शायद ही बात कर रहे है? प्रो का उपयोग क्यों करें? क्या वे दोनों "paid_with_card" नहीं कहते हैं? तरीका?

अग्रिम धन्यवाद

उत्तर

15

उपरोक्त उदाहरण में, सशर्त विधि के लिए प्रतीक का उपयोग करना शायद सबसे अच्छा विकल्प होगा।

class Order < ActiveRecord::Base 
    before_save :normalize_card_number, :if => :paid_with_card? 
end 

स्ट्रिंग विकल्प स्ट्रिंग में रूबी कोड का मूल्यांकन करने के लिए eval का उपयोग करता है। तो व्यक्तिगत रूप से, यदि कोई छोटी इनलाइन स्थिति लिखने पर विधि या प्रक्रिया को कॉल करना है तो मैं प्रतीक का उपयोग करना पसंद करूंगा।

प्रति RailsGuides documentation:

एक प्रोक वस्तु का उपयोग करके आप एक अलग विधि के बजाय एक इनलाइन हालत लिखने की क्षमता देता है। यह विकल्प एक-लाइनर के लिए सबसे उपयुक्त है।

मैं बेहतर इस तरह से समझा जा सकता है एक प्रोक का उपयोग कर लगता है:

class Order < ActiveRecord::Base 
    before_save :normalize_card_number, 
    :if => Proc.new { |order| order.payment_type == "card" } 
end 

यह संभवतः paid_with_card की आवश्यकता को समाप्त होगा? तरीका।

+0

हाँ, इसे कूड़े रेल मॉडल को pay_with_card जैसी विधियों के साथ पसंद नहीं किया जा सकता है? – sunkencity

+0

मुझे लगता है कि: यदि चीज बताती है कि कॉन्फ़िगरेशन विकल्पों में से एक बहुत सारे हैं जो स्वचालित रूप से शामिल हैं और किसी अन्य संदर्भ से पुन: उपयोग किए जाते हैं। इसे संभालने का एक डिफ़ॉल्ट तरीका है: if => स्ट्रिंग, proc, आदि जैसे कॉन्फ़िगरेशन विकल्पों में और शायद: जब तक कि काम भी न हो। – sunkencity

2

मैं कहना चाहता हूँ यह मामला था कि रेल के पुराने संस्करणों में है कि हम कैसे काम करने के लिए प्रयोग किया जाता है, और कोई सुविधा है जिससे आप एक स्ट्रिंग गुजर सकता है जोड़ा एक उदाहरण के रूप में मूल्यांकन किया जाना वर्तमान मॉडल पर विधि।

सरल परिदृश्यों में यह पुरानी शैली को अनावश्यक बनाता है, लेकिन अधिक जटिल 'अगर' बयानों के लिए प्रो के उपयोग की अनुमति देता है जो केवल वर्तमान उदाहरण पर एक विधि का उपयोग करके हासिल करना असंभव होगा।

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

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