Я работаю над созданием моего первого плагина для направляющих. Я все еще довольно плохо знаком с рубином, и я задавался вопросом если его возможное для получения наследующего класса?
Например, я пытаюсь создать плагин, который позволит поблочное тестирование и функциональное тестирование, когда Вы не будете использовать миграции. То, что я пытаюсь сделать, инициализируют переменную класса, названную контроллером, который будет инициализирован к типу контроллера, который тестируется.
Если у меня есть базовый класс ControllerTest:
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
Таким образом, то, на чем я в настоящее время застреваю, получает название наследующего класса. Действительно ли это возможно? И в противном случае кто-либо знает иначе о том, как я мог пойти о реализации этого?
Заранее спасибо.
Если вы хотите получить имя класса, в котором вы сейчас участвуете, вы можете использовать self.class.name
. Если вы хотите получить суперклассы, вы можете использовать массив self.class.ancestors
, например self.class.ancestors [1] .name
. Непосредственный суперкласс также доступен как 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
Это выводит
Created FooController to control Foo
Created BarController to control Bar
Я полагаю, вам нужно будет перехватывать классы по мере их определения...
Из RDoc для класса Class:
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
Очень просто: используйте "унаследованный" обратный вызов.
Из RDoc для класса Class: inherited(subclass): Обратный вызов, вызываемый всякий раз, когда создается подкласс текущего класса.
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