列表子类在Ruby脚本/控制台中不起作用?

这有效:

>> class Foo >> def xyz() >> Foo.subclasses >> end >> end => nil >> class Bar > end => nil >> class Quux > end => nil >> Foo.new.xyz() => ["Quux", "Bar"] 

但事实并非如此。 User是我的应用程序中的一个类。

 >> User.subclasses NoMethodError: protected method `subclasses' called for # from [...]/vendor/rails/activerecord/lib/active_record/base.rb:1546:in `method_missing' from (irb):13 

但这样做!

 >> Foo.subclasses => ["Quux", "Bar"] 

这里发生了什么? 我如何列出User的子类?

子类被重写并在base.rb中受到保护。 请参阅http://www.google.com/codesearch/p?hl=zh-CN&sa=N&cd=1&ct=rc#m8Vht-lU3vE/vendor/rails/activerecord/lib/active_record/base.rb&q=active_record/base.rb (行1855定义方法子类,第1757行使其受保护)。

用户可以像对Foo那样做同样的事情:添加一个xyz()方法。

您不需要重新声明(如Tim的答案 ) 提供辅助方法(如Rutger的答案 )。 您只需要更改方法的权限(作为类方法,需要一些恶作剧):

 class User < ActiveRecord::Base class < 

只是要解决访问权限而不是更改任何内容,请考虑使用可以访问私有方法的#send方法。

 User.send(:subclasses) 
Interesting Posts