Convertir une chaîne en symboles en rubis

241

Les symboles sont généralement représentés comme tels

:book_author_title

mais si j'ai une chaîne:

"Book Author Title"

y a-t-il un chemin intégré dans rails / ruby ​​pour le convertir en un symbole où je peux utiliser la : notation sans simplement faire un regex de chaîne brut?

Christophe
la source
Plutôt que la conversion, vous pourriez être intéressé par un accès indifférent - des méthodes qui fonctionnent de manière égale pour les paramètres de chaîne et de symbole .
Boris Stitnicky

Réponses:

361

Rails a un ActiveSupport::CoreExtensions::String::Inflectionsmodule qui fournit de telles méthodes. Ils valent tous la peine d'être examinés. Pour votre exemple:

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
Priit
la source
ça marche vraiment bien! vous pourriez avoir des mots météo ou non où ils étaient capitalisés. le paramétrage le triera.
TheLegend
existe-t-il un moyen d'inverser cela, sans utiliser gsub?
Zack
@Zack .to_set .humanizedevrait faire le travail à moins que vous ne deviez conserver une capitalisation complète.
Tyler Diaz du
Une bonne façon d'aborder la conversion de n'importe quoi est de pouvoir faire et annuler une opération. .to_sym peut convertir une direction (de chaîne en symbole) et .to_s peut convertir (de symbole en chaîne). et si vous avez affaire à un tableau, envisagez .map (&: to_sym) ou .map (& to_s) pour convertir tous les éléments.
jasonleonhard
2
parameterize ('_'). to_sym est un peu plus court que parameterize.underscore.to_sym.
IAmNaN
228

à partir de: http://ruby-doc.org/core/classes/String.html#M000809

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

Renvoie le symbole correspondant à str, créant le symbole s'il n'existait pas auparavant. Tu vois Symbol#id2name.

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

Cela peut également être utilisé pour créer des symboles qui ne peuvent pas être représentés à l'aide de la :xxxnotation.

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

Mais pour votre exemple ...

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

devrait aller ;)

zzeroo
la source
1
Des exemples brillants. Je vous remercie.
Paul
8
L'affiche originale était peut-être satisfaite de la réponse de Rails, mais ce message répond à la question posée.
Russ Bateman
2
Il n'est pas vrai que "[ to_sym] peut également être utilisé pour créer des symboles qui ne peuvent pas être représentés à l'aide de la notation: xxx". :'cat and dog'est le même que 'cat and dog'.to_sym.
Michael Dorst
2
On peut même faire des choses bizarres :"cat and dog\n on a new line"sans avoir besoin de to_sym.
Michael Dorst
3
La question concernait la conversion en Ruby, pas Rails. Ceci est une bonne réponse.
Katarzyna
14

intern → symbol Renvoie le symbole correspondant à str, créant le symbole s'il n'existait pas auparavant

"edition".intern # :edition

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

Julio Marins
la source
Comme celle-ci puisque ma solution string.to_sym me donne un avertissement de sécurité :)
Denny Mueller
11

Dans Rails, vous pouvez le faire en utilisant la underscoreméthode:

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

Le code plus simple utilise regex (fonctionne avec Ruby):

"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title
Chandra Patni
la source
3
cela ne fonctionnera que si tous les mots commencent par un majuscule, si c'était "mon gros chien" il retournera: myfat_dog.
TheLegend
9

Est-ce ce que vous cherchez ?:

:"Book Author Title"

:)

Kai Stinchcombe
la source
1

Cela ne répond pas à la question elle-même, mais j'ai trouvé cette question en recherchant la solution pour convertir une chaîne en symbole et l'utiliser sur un hachage.

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}

J'espère que cela aide quelqu'un comme moi!

Fábio Araújo
la source