2009-11-28 11 views
15

どのようにしてモジュールからクラスを取得できますか?モジュールからクラス名を取得

module ActMethods 
    def some_method(*attr_names) 
    cls = self.class # this doesn't work 
    end 
end 

どのようにしてこのモジュールでクラスの名前がロードされるのですか?

+0

動作しているはずです。 self.class.nameが必要かもしれません – khelll

+0

クラスが匿名で拡張されている場合、self.classまたはself.class.nameを出力すると空白が返ってくるので、混乱する可能性があります。この場合、self.class.superclassをチェックすることも良いでしょう。 –

+0

'self.class'は私のために働いていません。 'self.class.name'は" Module "を返します。私はそれが私のモジュールが含まれるクラスがActiveRecord :: Base(Rails 3.2.8)から継承しているという事実と関係があると思いますが、それがなぜ、どのように干渉しているのか分かりません。 –

答えて

9

self.classメソッドが呼び出されるオブジェクトのクラスを取得します。モジュールがクラスに含まれていたと仮定すると、これはモジュールを含むクラスかそのサブクラスのいずれかです。あなたが本当に名前だけを望むなら、代わりにself.class.nameを使うことができます。

モジュールを使用してクラスを拡張し、そのクラスを取得する場合は、cls = self(またはクラス名を文字列として使用する場合はcls = name)を使用できます。

上記のいずれにも該当しない場合は、必要なものを明確にする必要があります。

1

私のために働きます。 seppが言ったように、それを働かせるにはそれを含める必要があります。

module ActMethods 
    def some_method(*attr_names) 
    cls = self.class # this doesn't work 
    puts cls 
    end 
end 

class Boh 
    include ActMethods 
end 

b = Boh.new 
b.some_method 
6

selfが何らかの理由でできない場合は、代替はancestorshttp://ruby-doc.org/core-2.0/Module.html#method-i-ancestors

# rails concern example: 

module Foo 
    extend ActiveSupport::Concern 

    included do 
    p "Wooo hoo, it's #{top_ancestor_class}" 
    end 

    module ClassMethods 
    def top_ancestor_class 
     ancestors.first 
    end 
    end 
end 

class Event < ActiveRecord::Base 
    include Foo 
end 

#=> Woo hoo, it's Event(....) 
+0

私の記事の詳細はこちらhttp://www.eq8.eu/blogs/13-ruby-ancestors-descendants-他の迷惑な親戚 – equivalent8

1

PSかもしれません:一般的な場合の答えのために、sepp2kの回答を参照してください。

コントローラにのみモジュールを組み込んだ場合は、controller_name.classifyを使用して、対応するモデルの名前を取得することを検討してください。例:

>> ArticlesController.controller_name.classify 
=> "Article" 

そこからあなたが結果に.constantizeを呼び出すことによって、(必要に応じ)、実際のクラスを得ることができます。