2010-04-03 17 views
11

समर्थित नहीं है में "चंचल वेब विकास रेल के साथ" (तीसरा संस्करण) पेज 537 - 541 इस प्रकार यह "कस्टम प्रपत्र बिल्डर्स" कोड है:अंतर्निहित तर्क define_method (द्वारा परिभाषित विधि से सुपर के गुजर)

class TaggedBuilder < ActionView::Helpers::FormBuilder 
    # <p> # <label for="product_description">Description</label><br/> # <%= form.text_area 'description' %> #</p> 
    def self.create_tagged_field(method_name) 
     define_method(method_name) do |label, *args| 
     @template.content_tag("p" , @template.content_tag("label" , label.to_s.humanize, 
     :for => "#{@object_name}_#{label}") + "<br/>" + super) 
     end 
    end 
    field_helpers.each do |name| 
     create_tagged_field(name) 
    end 
    end 

यह कोड रूबी 1.9.1 के साथ काम नहीं करता है। यह त्रुटि देता है इस प्रकार है:

implicit argument passing of super from method defined by define_method() is not supported. Specify all arguments explicitly. (ActionView::TemplateError)

मेरा प्रश्न है: क्या मैं इसे ठीक करने के लिए कोड में बदलना चाहिए?

उत्तर

15

super उपरोक्त सभी पैरामीटर पारित करें (यह recent question देखें)।

त्रुटि संदेश कहता है, आपको यहां "सभी तर्क स्पष्ट रूप से निर्दिष्ट करना होगा"। super(label, *args) के साथ super बदलें।

+0

अब काम कर रहा है, धन्यवाद! – jaycode

9

मैं

define_method :"#{info_type}_info" do 

    info = super 
    ....... 

end 

तर्क

के बिना एक define_method में इस समस्या से सामना करना पड़ा और फिर भी इस समस्या को मिला। मुझे स्पष्ट रूप से कोष्ठक रखना था:

define_method :"#{info_type}_info" do 

    info = super() 
    ....... 

end 
+1

जो मुझे रूबी पार्सर में एक बग की तरह दिखता है। आप रूबी कोर टीम को एक रिपोर्ट जमा करना चाह सकते हैं। सुनिश्चित नहीं है कि यह ऐसा कुछ है जिसे वे ठीक कर सकते हैं या नहीं। माता-पिता की आवश्यकता मेरे लिए रूबी की तरह नहीं दिखती है। :) –

+3

यह एक बग प्रतीत नहीं होता है। [यह प्रश्न] देखें (http://stackoverflow.com/questions/2570428/constructor-overriding), और [यह फ़ॉर्म थ्रेड] (https://www.ruby-forum.com/topic/146693)। –