Wie kann ich einen Klassennamen programmgesteuert FooBar
in ein Symbol verwandeln :foo_bar
? zB so etwas, aber das behandelt Kamelkoffer richtig?
FooBar.to_s.downcase.to_sym
Wie kann ich einen Klassennamen programmgesteuert FooBar
in ein Symbol verwandeln :foo_bar
? zB so etwas, aber das behandelt Kamelkoffer richtig?
FooBar.to_s.downcase.to_sym
Antworten:
Rails wird mit einer Methode namens underscore
geliefert, mit der Sie CamelCased-Strings in underscore_separated-Strings umwandeln können. Möglicherweise können Sie Folgendes tun:
FooBar.name.underscore.to_sym
Sie müssen jedoch ActiveSupport installieren, um dies zu tun, wie ipsum sagt.
Wenn Sie ActiveSupport nicht nur dafür installieren möchten, können Sie Affen-Patches underscore
in sich String
selbst erstellen (die Unterstrichfunktion ist in ActiveSupport :: Inflector definiert ):
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
Schienen 4 .model_name
In Rails 4 wird ein ActiveModel::Name
Objekt zurückgegeben, das viele nützliche "semantischere" Attribute enthält, wie z.
FooBar.model_name.param_key
#=> "foo_bar"
FooBar.model_name.route_key
#=> "foo_bars"
FooBar.model_name.human
#=> "Foo bar"
Sie sollten also eine davon verwenden, wenn sie Ihrer gewünschten Bedeutung entspricht, was wahrscheinlich der Fall ist. Vorteile:
Übrigens, human
hat den Vorteil, I18N-fähig zu sein.
model_name
funktioniert auch zum Beispiel Objekte. Bsp. : foo_bar.model_name
. Wenn Sie die vollständige Liste möchten, schreiben Sie foo_bar.model_name.inspect
in die Rails-Konsole oder in Ihren Debugger
classify
, modelize
schien nicht zu funktionieren.
Erstens: gem install activesupport
require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
FooBar.to_s.underscore.to_sym
, da ich versuche, eine Klasse (die eine Konstante ist) in ein Symbol umzuwandeln, das ich dann an Factory Girl weitergeben kann . :)
Folgendes habe ich gewählt:
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
das Teil vorher zu entfernen ::
.