2012-05-10 18 views
5

के लिए एक कॉल जो आप देता है मैं ActiveAttr साथ काम कर रहा हूँ से एक ब्लॉक Scrubbing कि ब्लॉक विकल्प के माध्यम से अच्छा इनिशियलाइज़:सुपर

person = Person.new() do |p| 
    p.first_name = 'test' 
    p.last_name = 'man' 
end 

हालांकि, एक विशिष्ट वर्ग में शामिल हैं कि ActiveAttr :: मॉडल में, मैं चाहता हूँ इस कार्यक्षमता को बाईपास करें क्योंकि मैं किसी अन्य चीज़ के लिए ब्लॉक का उपयोग करना चाहता हूं। तो यहाँ हम चले:

class Imperator::Command 
include ActiveAttr::Model 
end 


class MyCommand < Imperator::Command 

    def initialize(*args, &block) 
    @my_block = block 

    super(*args) 
    end 
end 

यह बुरी तरह विफल रहता है, क्योंकि ब्लॉक अभी भी श्रृंखला को पारित कर दिया जाता है, और अंत में ActiveAttr के अंदर, इस कोड को चलाने के हो जाता है:

def initialize(*) 
    super 
    yield self if block_given? 
end 

तो मेरी कॉल की तरह लग रहा है, तो तो: इस प्रकार

MyCommand.new() { |date| date.advance(month: 1) } 

यह विफल रहता है:

NoMethodError: undefined method `advance' for #<MyCommand:0x007fe432c4fb80> 

क्योंकि MyCommand के पास कोई विधि नहीं है: इसे अग्रिम करें MyCommand को कॉल स्पष्ट रूप से विफल हो जाता है।

तो मेरा सवाल यह है कि, क्या मैं एक तरीका है कि मैं super पर कॉल करने से पहले विधि हस्ताक्षर से ब्लॉक को हटा सकता हूं, ताकि ब्लॉक मेरे ओवरराइड प्रारंभकर्ता से आगे नहीं जा सके?

उत्तर

12

super(*args,&nil) 

& बनाता ब्लॉक के रूप में गहरे लाल रंग का उपयोग नहीं के बराबर की कोशिश करो और गहरे लाल रंग का यह कोई ब्लॉक का मतलब है महसूस करने के लिए बहुत चालाक लगता है।

+0

बिल्कुल सही, मुझे नहीं पता कि मैंने इसके बारे में क्यों नहीं सोचा था। धन्यवाद! – TheDelChop

+1

यह एक रूबी बग होना चाहिए, हालांकि यह अभी भी रूबी 2.0 में मौजूद है – Mikey

0

यह निश्चित रूप से एक साफ चाल है, लेकिन एक बेहतर तरीका ActiveAttr :: मॉडल मॉड्यूल का उपयोग सीधे नहीं करना होगा और इसके बजाय केवल आपको आवश्यक मॉड्यूल शामिल करना होगा।

बजाय

class Imperator::Command 
    include ActiveAttr::Model 
end 

class Imperator::Command 
    include BasicModel 
    # include BlockInitialization 
    include Logger 
    include MassAssignmentSecurity 
    include AttributeDefaults 
    include QueryAttributes 
    include TypecastedAttributes 

    def initialize(*args, &block) 
    @my_block = block 
    super(*args) 
    end 
end 

करते हैं एक बार जब आप ActiveAttr :: मॉडल के विस्फोट दृश्य देख वहाँ अन्य बातों के तुम सच में नहीं करना चाहते हो सकता है कर रहा है। उस मामले में बस शामिल हैं। इरादा मॉडल निर्माण के लिए एक ला कार्टे दृष्टिकोण प्रदान करना था।

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