Как получить удобочитаемое имя класса в 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
Что это делает, так это принимает строковое имя класса (
Вам придется изменить регулярное выражение, если любое из ваших имен классов содержит несколько последовательных заглавных букв, особенно если последовательные заглавные буквы могут принадлежать разным словам (например, класс с именем
Обратите внимание, что метод, как я написал, также предполагает, что это метод класса. Метод экземпляра будет выглядеть так:
def humanize_class_name
self.class.inspect.scan(/[A-Z][a-z]+/).join(' ')
end
Я надеюсь, что это полезно для кого-то!