web-dev-qa-db-fra.com

Convertir une chaîne en symbole en mesure dans ruby

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

:book_author_title

mais si j'ai une ficelle:

"Book Author Title"

existe-t-il une méthode intégrée dans Rails/Ruby pour le convertir en un symbole dans lequel je peux utiliser la notation : sans simplement effectuer une substitution de chaîne brute regex?

224
Christopher

Les rails ont le module ActiveSupport::CoreExtensions::String::Inflections qui fournit de telles méthodes. Ils valent tous la peine d'être regardés. Pour votre exemple:

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
337
Priit

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

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

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

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

Ceci peut également être utilisé pour créer des symboles qui ne peuvent pas être représentés avec la notation :xxx.

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

Mais pour votre exemple ...

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

devrait aller ;)

222
zzeroo
"Book Author Title".parameterize('_').to_sym
=> :book_author_title

http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize

paramétrer est une méthode Rails et vous permet de choisir le séparateur souhaité. C'est un tiret "-" par défaut.

23
Chris Ciollaro

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

13
Julio Marins

Dans Rails, vous pouvez utiliser la méthode underscore:

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

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

"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title
11
Chandra Patni

Est-ce ce que vous cherchez ?:

:"Book Author Title"

:)

10
Kai Stinchcombe