Як я можу програмно перетворити назву класу FooBar
, на символ :foo_bar
,? наприклад щось подібне, але це правильно справляється з випадком верблюда?
FooBar.to_s.downcase.to_sym
Як я можу програмно перетворити назву класу FooBar
, на символ :foo_bar
,? наприклад щось подібне, але це правильно справляється з випадком верблюда?
FooBar.to_s.downcase.to_sym
Відповіді:
Rails поставляється з методом, який називається, underscore
що дозволить вам перетворити рядки CamelCased в рядки, виділені підкресленням. Отже, ви можете зробити це:
FooBar.name.underscore.to_sym
Але вам доведеться встановити ActiveSupport просто для цього, як говорить ipsum.
Якщо ви не хочете встановлювати ActiveSupport тільки для цього, ви можете перенести мавпу underscore
в String
себе (функція підкреслення визначена в ActiveSupport :: Inflector ):
class String
def underscore
word = self.dup
word.gsub!(/::/, '/')
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
word.tr!("-", "_")
word.downcase!
word
end
end
Рейки 4 .model_name
У Rails 4 він повертає ActiveModel::Name
об'єкт, який містить багато корисних більш "семантичних" атрибутів, таких як:
FooBar.model_name.param_key
#=> "foo_bar"
FooBar.model_name.route_key
#=> "foo_bars"
FooBar.model_name.human
#=> "Foo bar"
Тож ви повинні використовувати один із них, якщо вони відповідають вашому бажаному значенню, що, швидше за все, і є. Переваги:
До речі, human
перевага полягає в тому, що він знає I18N.
model_name
також працює для об'єктів, наприклад. Приклад: foo_bar.model_name
. Якщо ви хочете повний список, напишіть foo_bar.model_name.inspect
на консоль
classify
, modelize
не схоже на роботу.
перше: підтримка активної роботи з gem
require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
FooBar.to_s.underscore.to_sym
, оскільки я намагаюся перетворити клас (який є константою) у символ, який я потім можу передати Factory Girl . :)
Ось для чого я пішов:
module MyModule
module ClassMethods
def class_to_sym
name_without_namespace = name.split("::").last
name_without_namespace.gsub(/([^\^])([A-Z])/,'\1_\2').downcase.to_sym
end
end
def self.included(base)
base.extend(ClassMethods)
end
end
class ThisIsMyClass
include MyModule
end
ThisIsMyClass.class_to_sym #:this_is_my_class
String#demodulize
видалити деталь раніше ::
.