Come posso trasformare a livello di codice un nome di classe,, FooBar
in un simbolo :foo_bar
,? ad esempio qualcosa di simile, ma che gestisce correttamente la custodia del cammello?
FooBar.to_s.downcase.to_sym
Come posso trasformare a livello di codice un nome di classe,, FooBar
in un simbolo :foo_bar
,? ad esempio qualcosa di simile, ma che gestisce correttamente la custodia del cammello?
FooBar.to_s.downcase.to_sym
Risposte:
Rails viene fornito con un metodo chiamato underscore
che ti permetterà di trasformare stringhe CamelCased in stringhe underscore_separated. Quindi potresti essere in grado di farlo:
FooBar.name.underscore.to_sym
Ma dovrai installare ActiveSupport solo per farlo, come dice ipsum.
Se non si desidera installare ActiveSupport solo per questo, è possibile eseguire la patch di scimmia underscore
in String
se stessi (la funzione di sottolineatura è definita in 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
Rotaie 4 .model_name
In Rails 4, restituisce un ActiveModel::Name
oggetto che contiene molti attributi "semantici" più utili come:
FooBar.model_name.param_key
#=> "foo_bar"
FooBar.model_name.route_key
#=> "foo_bars"
FooBar.model_name.human
#=> "Foo bar"
Quindi dovresti usarne uno se corrisponde al significato desiderato, il che è probabilmente il caso. Vantaggi:
BTW, human
ha il vantaggio di essere a conoscenza di I18N.
model_name
funziona anche per oggetti di esempio. Es: foo_bar.model_name
. Se vuoi la lista completa scrivi foo_bar.model_name.inspect
nella console rails o nel tuo debugger
classify
, modelize
ha non sembra funzionare.
primo: gem install activesupport
require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
FooBar.to_s.underscore.to_sym
, dal momento che sto cercando di convertire una classe (che è una costante) in un simbolo, che posso quindi fornire a Factory Girl . :)
Ecco cosa ho scelto:
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
che rimuoverà la parte prima ::
.