Как программно превратить имя класса 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
Но, как говорит ipsum, вам нужно будет установить ActiveSupport только для этого.
Если вы не хотите устанавливать ActiveSupport только для этого, вы можете обезьяна патч underscore
в String
себя (функция подчеркивания определяется в ActiveSupport :: инфлектор ):
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
в консоли rails или в вашем отладчике
classify
, modelize
похоже, не сработало.
сначала: gem install activesupport
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
которая удалит предыдущую часть ::
.