Как программно превратить имя класса 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которая удалит предыдущую часть ::.