Как программно превратить имя класса FooBar
в символ :foo_bar
? например, что-то вроде этого, но это правильно обрабатывает случай верблюда?
FooBar.to_s.downcase.to_sym
ruby-on-rails
ruby
metaprogramming
Джош Гловер
источник
источник
Рельсы 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
которая удалит предыдущую часть::
.