Руби получить наследующий класс - PullRequest
5 голосов
/ 11 апреля 2010

Я работаю над созданием моего первого плагина для рельсов. Я все еще новичок в ruby, и мне было интересно, можно ли получить наследующий класс?

Например, я пытаюсь создать плагин, который позволит проводить модульное и функциональное тестирование, когда вы не используете миграции. То, что я пытаюсь сделать, это инициализировать переменную класса с именем controller для инициализации в соответствии с типом проверяемого контроллера.

Если у меня есть базовый класс 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

Итак, в данный момент я получаю имя наследующего класса. Это возможно? А если нет, кто-нибудь знает другой способ, как я мог бы реализовать это?

Заранее спасибо.

Ответы [ 4 ]

9 голосов
/ 11 апреля 2010

Очень просто: используйте «унаследованный» обратный вызов.

Из RDoc для класса Class: наследуемый (подкласс): обратный вызов вызывается всякий раз, когда создается подкласс текущего класса.

Пример:

   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 / ядро ​​/ классов / Class.html # M002785

9 голосов
/ 11 апреля 2010

Если вы хотите получить название класса, в котором вы находитесь в данный момент, вы можете использовать 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
0 голосов
/ 26 февраля 2014

Это будет перечислять только методы экземпляра в текущем классе

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

И общее решение c = some_class

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

0 голосов
/ 11 апреля 2010

Полагаю, вам нужно ловить классы по мере их определения ...

Из 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...