Comment puis-je transformer par programme un nom de classe,, FooBar
en symbole :foo_bar
,? par exemple quelque chose comme ça, mais qui gère correctement le cas de chameau?
FooBar.to_s.downcase.to_sym
Comment puis-je transformer par programme un nom de classe,, FooBar
en symbole :foo_bar
,? par exemple quelque chose comme ça, mais qui gère correctement le cas de chameau?
FooBar.to_s.downcase.to_sym
Réponses:
Rails est livré avec une méthode appelée underscore
qui vous permettra de transformer des chaînes CamelCased en chaînes underscore_separated. Vous pourrez donc peut-être faire ceci:
FooBar.name.underscore.to_sym
Mais vous devrez installer ActiveSupport juste pour faire cela, comme le dit ipsum.
Si vous ne souhaitez pas installer ActiveSupport juste pour cela, vous pouvez singe-patch underscore
en String
vous - même (la fonction underscore est définie dans 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
Rails 4 .model_name
Dans Rails 4, il renvoie un ActiveModel::Name
objet qui contient de nombreux attributs 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 s'il correspond à la signification souhaitée, ce qui est probablement le cas. Avantages:
BTW, human
a l'avantage d'être conscient I18N.
model_name
fonctionne également pour les objets par exemple. Ex: foo_bar.model_name
. Si vous voulez que la liste complète soit écrite foo_bar.model_name.inspect
dans la console des rails ou votre débogueur
classify
, modelize
ne semble pas fonctionner.
first: gem install activesupport
require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
FooBar.to_s.underscore.to_sym
Cela devrait être , puisque j'essaie de convertir une classe (qui est une constante) en un symbole, que je peux ensuite transmettre à Factory Girl . :)
Voici ce que j'ai fait:
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
qui supprimera la pièce avant ::
.