Konvertieren Sie eine Zeichenfolge in eine symbolfähige Zeichenfolge in Ruby

241

Symbole werden normalerweise als solche dargestellt

:book_author_title

aber wenn ich eine Zeichenfolge habe:

"Book Author Title"

Gibt es eine eingebaute Methode in Rails / Ruby, um sie in ein Symbol umzuwandeln, in dem ich die : Notation verwenden kann, ohne nur einen regulären String-Regex zu ersetzen?

Christopher
quelle
Anstelle einer Konvertierung könnten Sie an gleichgültigen Zugriffsmethoden interessiert sein, die sowohl für Zeichenfolgen- als auch für Symbolparameter gleichermaßen funktionieren .
Boris Stitnicky

Antworten:

360

Rails hat ein ActiveSupport::CoreExtensions::String::InflectionsModul, das solche Methoden bereitstellt. Sie sind alle einen Blick wert. Für Ihr Beispiel:

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
Priit
quelle
das funktioniert wirklich gut! Sie könnten jedes Wort Wetter haben oder nicht, wo sie groß geschrieben wurden. Die Parametrierung wird es aussortieren.
TheLegend
Gibt es eine Möglichkeit, dies umzukehren, ohne gsub zu verwenden?
Zack
@Zack .to_sund .humanizesollte den Job machen, es sei denn, Sie müssen die volle Kapitalisierung beibehalten.
Tyler Diaz
Ein guter Weg, um etwas zu konvertieren, besteht darin, einen Vorgang ausführen und rückgängig machen zu können. .to_sym kann eine Richtung konvertieren (von Zeichenfolge zu Symbol) und .to_s kann konvertieren (von Symbol zu Zeichenfolge). und wenn Sie es mit einem Array zu tun haben, ziehen Sie .map (&: to_sym) oder .map (& to_s) in Betracht, um alle Elemente zu konvertieren.
Jasonleonhard
2
parameterize ('_'). to_sym ist etwas kürzer als parameterize.underscore.to_sym.
IAmNaN
228

von: http://ruby-doc.org/core/classes/String.html#M000809

str.intern => symbol
str.to_sym => symbol

Gibt das entsprechende Symbol zurück strund erstellt das Symbol, falls es zuvor nicht vorhanden war. Siehe Symbol#id2name.

"Koala".intern         #=> :Koala
s = 'cat'.to_sym       #=> :cat
s == :cat              #=> true
s = '@cat'.to_sym      #=> :@cat
s == :@cat             #=> true

Dies kann auch verwendet werden, um Symbole zu erstellen, die mit der :xxxNotation nicht dargestellt werden können .

'cat and dog'.to_sym   #=> :"cat and dog"

Aber für dein Beispiel ...

"Book Author Title".gsub(/\s+/, "_").downcase.to_sym

sollte gehen ;)

zzeroo
quelle
1
Geniale Beispiele. Danke dir.
Paul
8
Das Originalposter war möglicherweise mit der Antwort von Rails zufrieden, aber dieser Beitrag beantwortet die tatsächlich gestellte Frage.
Russ Bateman
2
Es ist nicht wahr, dass "[ to_sym] auch verwendet werden kann, um Symbole zu erstellen, die nicht mit der: xxx-Notation dargestellt werden können". :'cat and dog'ist das gleiche wie 'cat and dog'.to_sym.
Michael Dorst
2
Man kann sogar so ausgefallene Dinge tun, wie es nicht :"cat and dog\n on a new line"nötig ist to_sym.
Michael Dorst
3
Die Frage betraf die Konvertierung in Ruby, nicht Rails. Dies ist eine richtige Antwort.
Katarzyna
14

intern → symbol Gibt das Symbol zurück, das str entspricht, und erstellt das Symbol, falls es zuvor nicht vorhanden war

"edition".intern # :edition

http://ruby-doc.org/core-2.1.0/String.html#method-i-intern

Julio Marins
quelle
Wie dieses, seit meine string.to_sym-Lösung mir eine Sicherheitswarnung gibt :)
Denny Mueller
11

In Rails können Sie dies mit folgender underscoreMethode tun :

"Book Author Title".delete(' ').underscore.to_sym
=> :book_author_title

Der einfachere Code verwendet Regex (funktioniert mit Ruby):

"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title
Chandra Patni
quelle
3
Dies funktioniert nur, wenn alle Wörter mit einem Großbuchstaben beginnen. Wenn es "mein fetter Hund" war, wird es zurückgegeben: myfat_dog.
TheLegend
9

Ist es das, wonach du suchst?:

:"Book Author Title"

:) :)

Kai Stinchcombe
quelle
1

Dies beantwortet nicht die Frage selbst, aber ich fand diese Frage auf der Suche nach der Lösung, um eine Zeichenfolge in ein Symbol zu konvertieren und sie für einen Hash zu verwenden.

hsh = Hash.new
str_to_symbol = "Book Author Title".downcase.gsub(/\s+/, "_").to_sym
hsh[str_to_symbol] = 10
p hsh
# => {book_author_title: 10}

Hoffe es hilft jemandem wie mir!

Fábio Araújo
quelle