2009-11-28 21 views
15

¿Cómo puedo obtener de un módulo el nombre de clase de la clase en la que está incluido el módulo?Obtener el nombre de clase de un módulo

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

¿Cómo puedo entrar en la variable cls el nombre de la clase que con este módulo está cargado?

+0

¡Debería estar funcionando! Puede ser que necesite self.class.name – khelll

+0

Tenga en cuenta que si la clase se extiende en anónimo, imprimir self.class o self.class.name se devuelve en blanco, lo que puede ser confuso. En este caso, también es bueno comprobar self.class.superclass. –

+0

'self.class' no funciona para mí. 'self.class.name' devuelve" Módulo ". Creo que tiene que ver con el hecho de que la clase en la que se incluye mi módulo hereda de ActiveRecord :: Base (Rails 3.2.8) pero no estoy seguro de por qué o cómo eso interfiere. –

Respuesta

9

self.class obtiene la clase del objeto al que se llama el método. Suponiendo que el módulo se incluyó en una clase, esta es la clase que incluyó el módulo o una subclase de la misma. Si realmente quiere el nombre, puede usar self.class.name en su lugar.

Si amplió una clase con el módulo y desea obtener esa clase, puede simplemente hacer cls = self (o cls = name si desea el nombre de la clase como una cadena).

Si ninguno de los anteriores ayuda, debe aclarar lo que desea.

1

Funciona para mí. Como sepp dijo que tienes que incluirlo para que funcione.

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

si self no es una opción, por alguna razón, alternativa podría ser 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 más información en mi artículo http://www.eq8.eu/blogs/13-ruby-ancestors-descendants- y otros parientes molestos – equivalent8

1

PS: Para el caso de una respuesta general, véase la respuesta de sepp2k.

Si incluyó el módulo solo en los controladores, es posible que desee considerar el uso de controller_name.classify para obtener el nombre del modelo correspondiente. Ejemplo:

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

Desde allí se puede obtener la clase real (si lo desea), llamando .constantize en el resultado.

Cuestiones relacionadas