Comment convertir un nom de classe Ruby en un symbole délimité par des caractères de soulignement?

Comment puis-je convertir un nom de classe, FooBar , en symbole, par exemple :foo_bar ? par exemple quelque chose comme ça, mais qui gère le cas du chameau correctement?

 FooBar.to_s.downcase.to_sym 

Rails est livré avec une méthode appelée underscore qui vous permettra de transformer les chaînes CamelCased en chaînes de caractères underscore_separated. Donc, vous pourriez être en mesure de le faire:

 FooBar.name.underscore.to_sym 

Mais pour cela, vous devez installer ActiveSupport, comme le dit ipsum.

Si vous ne voulez pas installer ActiveSupport juste pour cela, vous pouvez utiliser un underscore patch de underscore dans Ssortingng vous-même (la fonction de soulignement est définie dans ActiveSupport :: Inflector ):

 class Ssortingng def underscore word = self.dup word.gsub!(/::/, '/') word.gsub!(/([AZ]+)([AZ][az])/,'\1_\2') word.gsub!(/([az\d])([AZ])/,'\1_\2') word.tr!("-", "_") word.downcase! word end end 

model_name

Dans Rails 4, il retourne un object ActiveModel::Name qui contient de nombreux atsortingbuts plus “sémantiques” utiles tels que:

 FooBar.model_name.param_key #=> "foo_bar" FooBar.model_name.route_key #=> "foo_bars" FooBar.model_name.human #=> "Foo bar" 

Vous devriez donc en utiliser un si celui-ci correspond à la signification souhaitée, ce qui est probablement le cas. Avantages:

  • plus facile à comprendre votre code
  • votre application fonctionnera toujours même dans l’événement (improbable) que Rails décide de modifier une convention de dénomination.

BTW, l’ human a l’avantage d’être conscient de I18N.

d’abord: gem install activesupport

 require 'rubygems' require 'active_support' "FooBar".underscore.to_sym 

Voici ce que je suis allé pour:

 module MyModule module ClassMethods def class_to_sym name_without_namespace = name.split("::").last name_without_namespace.gsub(/([^\^])([AZ])/,'\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