Comment puis-je convertir un Rubis nom de la classe à un trait de soulignement délimité par le symbole?
Comment puis-je par programmation tourner un nom de classe, FooBar, un symbole, :foo_bar? par exemple, quelque chose comme cela, mais qui traite de chameau cas correctement?
Rails est livré avec une méthode appelée underscore qui vous permettra de vous transformer en Camelcase les chaînes en underscore_separated cordes. Donc, vous pourriez être en mesure de le faire:
FooBar.name.underscore.to_sym
Mais vous aurez à installer ActiveSupport viens de le faire, comme ipsum dit.
Si vous ne souhaitez pas installer ActiveSupport juste pour cela, vous pouvez singe-patch underscore en String vous-même (le trait de soulignement fonction est définie dans ActiveSupport::Inflecteur):
classStringdef underscore
word =self.dup
word.gsub!(/::/,'/')
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'_')
word.gsub!(/([a-z\d])([A-Z])/,'_')
word.tr!("-","_")
word.downcase!
word
endend
Merci. J'avais peur que cela était une des Rails d'extension. 🙂 Pas de soucis, comme je suis en fait à l'aide de Rails.
Alors vous devriez avoir étiqueté à votre question en conséquence. Ici, permettez-moi de le faire pour vous...
Non, pas ActiveRecord. ActiveSupport.
En effet, permettez-moi de le changer
comment faire l'inverse?
ouvrir une autre question pour que.
Qu'en est plus__priced_item pour donner Plus::PricedItem (espace de noms impliqués)? J'utilise 'plus::_priced_items' mais il se sent si mal
veuillez ouvrir une autre question pour qui, cette question est sur le soulignant.
Cette réponse ne fonctionne pas pour des espaces de classes. Foo::Bar.to_s.trait de soulignement devient foo/bar
De sorte que vous devriez utiliser l'un de ces si elles correspondent à votre sens désiré, ce qui est probablement le cas. Avantages:
plus facile à comprendre votre code
votre application fonctionnera toujours même dans le cas (improbable) que les Rails décide de modifier une convention de nommage.
BTW, human a l'avantage d'être I18N conscient.
model_name fonctionne également pour les objets d'instance. Ex: foo_bar.model_name. Si vous voulez la liste complète écrire foo_bar.model_name.inspect dans les rails de la console ou de votre débogueur
Devrait être FooBar.to_s.underscore.to_sym, depuis que je suis en train de convertir une classe (qui est une constante) dans un symbole, que je peux ensuite nourrir Factory Girl. 🙂
Rails est livré avec une méthode appelée
underscore
qui vous permettra de vous transformer en Camelcase les chaînes en underscore_separated cordes. Donc, vous pourriez être en mesure de le faire:Mais vous aurez à installer ActiveSupport viens de le faire, comme ipsum dit.
Si vous ne souhaitez pas installer ActiveSupport juste pour cela, vous pouvez singe-patch
underscore
enString
vous-même (le trait de soulignement fonction est définie dans ActiveSupport::Inflecteur):plus__priced_item
pour donnerPlus::PricedItem
(espace de noms impliqués)? J'utilise'plus::_priced_items'
mais il se sent si malRails 4
.model_name
Dans les Rails 4, il renvoie un
Activerecord::Name
objet qui contient beaucoup d'informations utiles en plus "sémantique" des attributs tels que:De sorte que vous devriez utiliser l'un de ces si elles correspondent à votre sens désiré, ce qui est probablement le cas. Avantages:
BTW,
human
a l'avantage d'être I18N conscient.model_name
fonctionne également pour les objets d'instance. Ex:foo_bar.model_name
. Si vous voulez la liste complète écrirefoo_bar.model_name.inspect
dans les rails de la console ou de votre débogueurpremière: gem install activesupport
FooBar.to_s.underscore.to_sym
, depuis que je suis en train de convertir une classe (qui est une constante) dans un symbole, que je peux ensuite nourrir Factory Girl. 🙂Voici ce que je suis pour:
String#demodulize
qui permettra d'éliminer la partie avant de::
.