2009-07-28 13 views
1

Cela fonctionne:Les sous-classes d'inscription ne fonctionnent pas dans Ruby script/console?

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

Mais cela ne fonctionne pas. User est une classe dans mon application.

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

Mais ce n'est pas le cas!

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

Que se passe-t-il ici? Comment pourrais-je lister les sous-classes de User?

Répondre

1

Vous n'avez pas besoin redéclarer (comme dans Tim's answer) ou fournissent une méthode d'assistance (comme dans Rutger's answer). Vous avez juste besoin de changer l'autorisation de la méthode (qui, étant une méthode de classe, nécessite quelques manigances):

class User < ActiveRecord::Base 

    class <<self 
    public :subclasses 
    end 

end 
1

Juste pour travailler autour des droits d'accès et ne pas changer quoi que ce soit, pensez à utiliser la méthode #send qui a accès à des méthodes privées.

User.send(:subclasses)