2009-11-28 20 views
15

Come posso ottenere da un modulo il nome classe della classe in cui è incluso il modulo?Ottieni il nome classe da un modulo

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

Come posso ottenere nella variabile cls il nome della classe a con questo modulo è caricato?

+0

Dovrebbe funzionare! Potrebbe essere necessario self.class.name – khelll

+0

Si noti che se la classe viene estesa in modo anonimo, la stampa di self.class o self.class.name restituisce uno spazio vuoto, il che può essere fonte di confusione. In questo caso, è anche utile controllare self.class.superclass. –

+0

'self.class' non funziona per me. 'self.class.name' restituisce" Modulo ". Penso che abbia a che fare con il fatto che la classe in cui è incluso il mio modulo erediti da ActiveRecord :: Base (Rails 3.2.8), ma non sono sicuro del perché o del modo in cui ciò interferisce. –

risposta

9

self.class ottiene la classe dell'oggetto su cui viene richiamato il metodo. Supponendo che il modulo fosse incluso in una classe, questa è la classe che includeva il modulo o una sua sottoclasse. Se vuoi solo il nome, puoi usare invece self.class.name.

Se si è estesa una classe con il modulo e si desidera ottenere tale classe, è sufficiente eseguire cls = self (o cls = name se si desidera che il nome della classe sia una stringa).

Se nessuno dei precedenti aiuta, è necessario chiarire cosa si desidera.

1

Lavori per me. Come sepp ha detto che devi includerlo affinché funzioni.

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

se self non è un'opzione per qualche motivo, un'alternativa potrebbe essere 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

BTW maggiori informazioni nel mio articolo http://www.eq8.eu/blogs/13-ruby-ancestors-descendants- e-altri-fastidiosi-parenti – equivalent8

1

PS: Per il caso risposta generale, vedere la risposta di sepp2k.

Se il modulo è stato incluso solo nei controller, è possibile prendere in considerazione l'utilizzo di controller_name.classify per ottenere il nome del modello corrispondente. Esempio:

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

Da lì si potrebbe ottenere la classe attuale (se si desidera), chiamando .constantize sul risultato.

Problemi correlati