我正在创建我的第一个rails插件。我仍然对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
所以我目前所坚持的是获取继承类的名称。这可能吗?如果没有,有没有人知道如何实现这个目标?
提前致谢。
答案 0 :(得分:9)
如果您希望获得目前所在班级的名称,可以使用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
答案 1 :(得分:9)
非常简单:使用“继承的”回调。
从Class类的RDoc: inherited(subclass):只要创建当前类的子类,就会调用Callback。
示例:
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
答案 2 :(得分:0)
我相信你需要在课程定义时抓住课程......
来自Class类的RDoc:
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
答案 3 :(得分:0)
这将仅列出当前类
中的实例方法self.class.new.methods - self.class.ancestors [1] .new.methods
通用解决方案 c = some_class
c.new.methods - c.ancestors [1] .new.methods