Как получить удобочитаемое имя класса в Ruby on Rails?

Я создаю приложение с Ruby 1.9.3 и Rails 3.0.9

У меня есть класс, как показано ниже.

module CDA
  class Document
    def humanize_class_name
      self.class.name.gsub("::","")
    end
  end
end

Я хочу имя класса, как "CDADocument".

Является ли мой метод humanize_class_name правильным способом для достижения этой цели?

ИЛИ ЖЕ

Любые другие встроенные методы, доступные с Rails?

3 ответа

Решение

Я думаю, что в Rails может быть что-то похожее, но поскольку форма, которую вы хотите, является своеобразной, вам придется самостоятельно разрабатывать метод. Позиция, где вы определяете это неправильно. Вы должны сделать это для каждого класса. Вместо этого вы должны определить его в классе Class.

class Class
    def humanize_class_name
      name.delete(":")
    end
end
some_instance.class.humanize_class_name #=> the string you want

или же

class Object
    def humanize_class_name
        self.class.name.delete(":")
    end
end
some_instance.humanize_class_name #=> the string you want

Если вы используете i18n ты можешь позвонить Model.model_name.human чтобы получить локализованное название модели.

Например: Event.model_name.human возвращает мое локализованное имя.

Документы: http://api.rubyonrails.org/classes/ActiveModel/Name.html

Для этого уже есть принятый ответ, но я решил поделиться тем, что я сделал, чтобы решить эту проблему без использования каких-либо материалов Rails. Это составляет в именах классов и все такое.

      def self.humanize_class_name
  self.inspect.scan(/[A-Z][a-z]+/).join(' ')
end

Что это делает, так это принимает строковое имя класса ( ) а потом создает массив любых строк символов в этом имени класса, которые соответствуют регулярным выражениям, которые затем объединяется в одну строку, помещая пробел между каждым словом. В этом случае регулярное выражение выбирает все строки в слове, которые состоят из одной заглавной буквы, за которой следует одна или несколько строчных букв.

Вам придется изменить регулярное выражение, если любое из ваших имен классов содержит несколько последовательных заглавных букв, особенно если последовательные заглавные буквы могут принадлежать разным словам (например, класс с именем должен быть гуманизирован как «Мой анализатор JSON», тогда как приведенное выше регулярное выражение будет отображать его как «Мой анализатор», поскольку последовательные заглавные буквы будут игнорироваться).

Обратите внимание, что метод, как я написал, также предполагает, что это метод класса. Метод экземпляра будет выглядеть так:

      def humanize_class_name
  self.class.inspect.scan(/[A-Z][a-z]+/).join(' ')
end

Я надеюсь, что это полезно для кого-то!

Другие вопросы по тегам