2009-11-28 24 views
15

मॉड्यूल से कक्षा के वर्ग नाम के मॉड्यूल से मैं कैसे प्राप्त कर सकता हूं?मॉड्यूल से कक्षा का नाम प्राप्त करें

module ActMethods 
    def some_method(*attr_names) 
    cls = self.class # this doesn't work 
    end 
end 

मैं इस मॉड्यूल के साथ कक्षा के नाम को क्लास परिवर्तनीय में कैसे प्राप्त कर सकता हूं?

+0

काम करना चाहिए! हो सकता है कि आपको self.class.name – khelll

+0

की आवश्यकता हो, ध्यान दें कि यदि वर्ग अज्ञात में विस्तारित किया जा रहा है, तो self.class या self.class.name को प्रिंट करना खाली हो जाता है, जो भ्रमित हो सकता है। इस मामले में, self.class.superclass की जांच करना भी अच्छा है। –

+0

'self.class' मेरे लिए काम नहीं कर रहा है। 'self.class.name' रिटर्न "मॉड्यूल"। मुझे लगता है कि इसे इस तथ्य के साथ करना है कि जिस कक्षा में मेरे मॉड्यूल को ActiveRecord :: बेस (रेल 3.2.8) से विरासत शामिल है, लेकिन मुझे यकीन नहीं है कि यह क्यों हस्तक्षेप कर रहा है या कैसे। –

उत्तर

9

self.class आपको उस ऑब्जेक्ट का वर्ग प्राप्त करता है जिस पर विधि को बुलाया जाता है। मॉड्यूल मानते हुए कक्षा में शामिल किया गया था, यह या तो कक्षा है जिसमें मॉड्यूल या उप-वर्ग शामिल था। यदि आप वास्तव में सिर्फ नाम चाहते हैं, तो आप इसके बजाय self.class.name का उपयोग कर सकते हैं।

यदि आपने मॉड्यूल के साथ कक्षा बढ़ा दी है और आप उस कक्षा को प्राप्त करना चाहते हैं, तो आप केवल cls = self (या cls = name कर सकते हैं यदि आप कक्षा का नाम स्ट्रिंग के रूप में चाहते हैं)।

यदि उपरोक्त में से कोई भी मदद नहीं करता है, तो आपको यह स्पष्ट करना चाहिए कि आप क्या चाहते हैं।

1

मेरे लिए काम करता है। जैसा कि सेप ने कहा था कि आपको इसे काम करने के लिए इसमें शामिल करना होगा।

module ActMethods 
    def some_method(*attr_names) 
    cls = self.class # this doesn't work 
    puts cls 
    end 
end 

class Boh 
    include ActMethods 
end 

b = Boh.new 
b.some_method 
6

अगर self किसी कारण से एक विकल्प नहीं है, विकल्प हो सकता है ancestorshttp://ruby-doc.org/core-2.0/Module.html#method-i-ancestors

# rails concern example: 

module Foo 
    extend ActiveSupport::Concern 

    included do 
    p "Wooo hoo, it's #{top_ancestor_class}" 
    end 

    module ClassMethods 
    def top_ancestor_class 
     ancestors.first 
    end 
    end 
end 

class Event < ActiveRecord::Base 
    include Foo 
end 

#=> Woo hoo, it's Event(....) 
+0

बीटीडब्ल्यू मेरे लेख में अधिक जानकारी http://www.eq8.eu/blogs/13-ruby-ancestors-descendants- और-अन्य-कष्टप्रद-रिश्तेदारों – equivalent8

1

पुनश्च: सामान्य मामले जवाब के लिए, sepp2k के जवाब देखें।

यदि आपने मॉड्यूल को केवल नियंत्रकों में शामिल किया है, तो आप संबंधित मॉडल का नाम प्राप्त करने के लिए controller_name.classify का उपयोग करने पर विचार करना चाहेंगे। उदाहरण:

>> ArticlesController.controller_name.classify 
=> "Article" 

वहां से आप (यदि आप चाहते हैं), वास्तविक वर्ग मिल सकता है परिणाम पर .constantize फोन करके।

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