Получить имя класса из модуля
Как я могу получить из модуля имя класса класса, в который включен модуль?
module ActMethods
def some_method(*attr_names)
cls = self.class # this doesn't work
end
end
Как я могу попасть в переменную cls, загружается ли имя класса с этим модулем?
Ответы
Ответ 1
self.class
предоставляет вам класс объекта, к которому вызывается метод. Предполагая, что модуль был включен в класс, это либо класс, который включает модуль, либо его подкласс. Если вы действительно просто хотите имя, вы можете использовать self.class.name
вместо этого.
Если вы расширили класс с помощью модуля и хотите получить этот класс, вы можете просто сделать cls = self
(или cls = name
, если вы хотите, чтобы имя класса было строкой).
Если ни одно из указанных выше не поможет, вы должны уточнить, что вы хотите.
Ответ 2
Если 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 #{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 Event(....)
Ответ 3
Работает для меня. Как сказал 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
Ответ 4
PS: Для ответа на общий случай см. ответ sepp2k.
Если вы включили модуль только в контроллеры, вам может потребоваться использовать controller_name.classify
, чтобы получить имя соответствующей модели. Пример:
>> ArticlesController.controller_name.classify
=> "Article"
Оттуда вы можете получить фактический класс (если хотите), вызвав .constantize
в результате.