Получить имя класса из модуля

Как я могу получить из модуля имя класса класса, в который включен модуль?

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 в результате.