2010-04-11 19 views
5

Estoy trabajando en la creación de mi primer complemento para los rieles. Todavía soy bastante nuevo para ruby ​​y me preguntaba si es posible obtener la clase heredera?Ruby hereda la clase

Por ejemplo, estoy tratando de crear un complemento que permita pruebas unitarias y pruebas funcionales cuando no esté utilizando migraciones. Lo que intento hacer es inicializar una variable de clase llamada controlador para inicializarla al tipo de controlador que se está probando.

Si tengo un ControllerTest clase base:

class ControllerTest < Test::Unit::TestCase 
    attr_accessor :controller 

    def initialize 
    super 
    @controller = "call function that will find the inheriting classes name and create an instance of that controller type." 
    end 
end 

Así que lo que estoy atascado en la actualidad es conseguir que el nombre de la clase que hereda. es posible? Y si no, ¿alguien sabe de otra manera sobre cómo podría implementar esto?

Gracias de antemano.

Respuesta

9

Si desea obtener el nombre de la clase en la que se encuentra actualmente, puede usar self.class.name. Si desea obtener las superclases, puede usar la matriz self.class.ancestors, p. self.class.ancestors[1].name. La superclase inmediata también está disponible como self.superclass.

class ControllerTest 
    attr_accessor :controller 
    def initialize 
    super 
    @controller = eval "#{self.class.name}Controller.new(self)" 
    end 
end 

class Foo <ControllerTest 
end 
class Bar <ControllerTest 
end 

class Controller 
    def initialize (o) 
    puts "Created #{self.class} to control #{o.class.name}" 
    end 
end 

class FooController <Controller 
end 
class BarController <Controller 
end 

foo = Foo.new 
bar = Bar.new 

Este salidas

Created FooController to control Foo 
Created BarController to control Bar 
+1

Para futuras referencias, la forma más fácil es simplemente usar la devolución de llamada "heredada". – fig

+1

@ fig-gnuton: Si es así, publique el ejemplo para lograr * lo mismo * (= obtenga un tipo específico de controlador basado en el nombre de la clase heredada) usando eso; eso sería realmente útil para cualquier persona que encuentre esta pregunta más tarde y en realidad significa preguntar cómo usar la devolución de llamada 'heredada' en lugar de de lo que se trataba esta pregunta. – Arkku

+1

Sería bueno obtener una explicación para el voto a la baja; es cierto que hubo desacuerdo sobre la interpretación de la pregunta, pero el código en esta respuesta funciona y responde a la pregunta según lo previsto por el solicitante. No es culpa de la respuesta si no responde alguna otra pregunta. – Arkku

9

muy simple:: utilizar la devolución de llamada "heredado"

Edición, ejemplo agregó.

Del RDoc para la clase Class: inherited (subclase): invocación de invocación cuando se crea una subclase de la clase actual.

Ejemplo:

class Foo 
     def self.inherited(subclass) 
     puts "New subclass: #{subclass}" 
     end 
    end 

    class Bar < Foo 
    end 

    class Baz < Bar 
    end 
produces: 

    New subclass: Bar 
    New subclass: Baz 

http://ruby-doc.org/core/classes/Class.html#M002785

+1

@ fig-gnuton: Como OP aceptó mi respuesta, parece que su voto negativo para "no responder la pregunta" puede haber sido algo incorrecto. – Arkku

+0

jajaja, la tuya sigue siendo la elección más pobre. El OP simplemente no sabe cómo seleccionar una respuesta. :) – fig

+1

@ fig-gnuton: El OP seleccionó la única respuesta que se ajusta al ejemplo de código publicado en su pregunta. La forma en que usted (y cualquier número de otros carteles) interpreta la redacción (ciertamente ambigua) al final no cambia lo que el OP * quería decir * preguntar. Entonces, a pesar de que su respuesta es perfectamente válida para la pregunta que * pensó *, preguntó, simplemente significa que la pregunta puede no haber sido clara para todos, pero resultó en una respuesta aceptable. – Arkku

0

Creo que necesita para coger las clases, ya que está siendo definidas ...

Desde el RDoc para la clase Clase:

inherited(subclass) 
Callback invoked whenever a subclass of the current class is created. 

Example: 

    class Foo 
     def self.inherited(subclass) 
     puts "New subclass: #{subclass}" 
     end 
    end 

    class Bar < Foo 
    end 

    class Baz < Bar 
    end 
produces: 

    New subclass: Bar 
    New subclass: Baz 
+0

Duplicó la misma respuesta publicada anteriormente. – fig

+0

Cuando comencé a publicar esta respuesta, la tuya no estaba allí. Lo siento si te ofendiste, pero no vi tu respuesta hasta que publiqué la mía. –

0

Esto listará solo los métodos de instancia en la clase actual

self.class.new.methods - self.class.ancestors [1] .new.methods

Y genérico solución c = some_class

c.new.methods - c.ancestors [1] .new.methods

Cuestiones relacionadas