Получить имя класса из модуля - PullRequest
16 голосов
/ 28 ноября 2009

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

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

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

Ответы [ 4 ]

10 голосов
/ 28 ноября 2009

self.class возвращает вам класс объекта, для которого вызывается метод. Предполагая, что модуль был включен в класс, это либо класс, который включает модуль, либо его подкласс. Если вы на самом деле просто хотите имя, вы можете использовать self.class.name.

Если вы расширили класс с помощью модуля и хотите получить этот класс, вы можете просто сделать cls = self (или cls = name, если вы хотите, чтобы имя класса представляло собой строку).

Если ничего из вышеперечисленного не поможет, вам следует уточнить, что вы хотите.

7 голосов
/ 13 августа 2013

, если 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(....)
1 голос
/ 09 июня 2017

PS: общий ответ см. В ответе sepp2k.

Если вы включили модуль только в контроллеры, вы можете рассмотреть возможность использования controller_name.classify для получения названия соответствующей модели. Пример:

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

Оттуда вы можете получить фактический класс (если хотите), вызвав .constantize для результата.

1 голос
/ 28 ноября 2009

У меня работает. Как сказал Сепп, вы должны включить его, чтобы он работал.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...