どのようにしてモジュールからクラスを取得できますか?モジュールからクラス名を取得
module ActMethods
def some_method(*attr_names)
cls = self.class # this doesn't work
end
end
どのようにしてこのモジュールでクラスの名前がロードされるのですか?
どのようにしてモジュールからクラスを取得できますか?モジュールからクラス名を取得
module ActMethods
def some_method(*attr_names)
cls = self.class # this doesn't work
end
end
どのようにしてこのモジュールでクラスの名前がロードされるのですか?
self.class
メソッドが呼び出されるオブジェクトのクラスを取得します。モジュールがクラスに含まれていたと仮定すると、これはモジュールを含むクラスかそのサブクラスのいずれかです。あなたが本当に名前だけを望むなら、代わりにself.class.name
を使うことができます。
モジュールを使用してクラスを拡張し、そのクラスを取得する場合は、cls = self
(またはクラス名を文字列として使用する場合はcls = name
)を使用できます。
上記のいずれにも該当しない場合は、必要なものを明確にする必要があります。
私のために働きます。 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
self
が何らかの理由でできない場合は、代替はancestors
http://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(....)
私の記事の詳細はこちらhttp://www.eq8.eu/blogs/13-ruby-ancestors-descendants-他の迷惑な親戚 – equivalent8
PSかもしれません:一般的な場合の答えのために、sepp2kの回答を参照してください。
コントローラにのみモジュールを組み込んだ場合は、controller_name.classify
を使用して、対応するモデルの名前を取得することを検討してください。例:
>> ArticlesController.controller_name.classify
=> "Article"
そこからあなたが結果に.constantize
を呼び出すことによって、(必要に応じ)、実際のクラスを得ることができます。
動作しているはずです。 self.class.nameが必要かもしれません – khelll
クラスが匿名で拡張されている場合、self.classまたはself.class.nameを出力すると空白が返ってくるので、混乱する可能性があります。この場合、self.class.superclassをチェックすることも良いでしょう。 –
'self.class'は私のために働いていません。 'self.class.name'は" Module "を返します。私はそれが私のモジュールが含まれるクラスがActiveRecord :: Base(Rails 3.2.8)から継承しているという事実と関係があると思いますが、それがなぜ、どのように干渉しているのか分かりません。 –