1

これは機能します:

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

しかし、これはそうではありません。User私のアプリケーションのクラスです。

>> 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

しかし、これはそうです!

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

何が起きてる?のサブクラスをリストするにはどうすればよいUserですか?

4

4 に答える 4

2

サブクラスはオーバーライドされ、base.rb で保護されます。http://www.google.com/codesearch/p?hl=en&sa=N&cd=1&ct=rc#m8Vht-lU3vE/vendor/rails/activerecord/lib/active_record/base.rb&q=active_record/base.rb (1855 はメソッドのサブクラスを定義し、1757 行はそれを保護します)。

Foo に対して行ったのと同じことを User に対して行うことができます: xyz() メソッドを追加します。

于 2009-07-28T17:40:11.003 に答える
1

何も変更せずにアクセス権を回避するには、プライベート メソッドにアクセスできる #send メソッドの使用を検討してください。

User.send(:subclasses)
于 2011-10-07T15:35:32.063 に答える
1

(ティムの回答のように)再宣言したり、ヘルパー メソッドを提供したりする必要はありません(ラトガーの回答のように)。メソッドのパーミッションを変更する必要があるだけです (これはクラス メソッドであるため、いくつかのシェナニガンが必要です)。

class User < ActiveRecord::Base

  class <<self
    public :subclasses
  end

end
于 2009-07-28T18:06:57.923 に答える