Converti la stringa in simbolo in rubino


241

I simboli sono generalmente rappresentati come tali

:book_author_title

ma se ho una stringa:

"Book Author Title"

c'è un modo integrato in rails / ruby ​​per convertirlo in un simbolo in cui posso usare la : notazione senza semplicemente fare una regex stringa grezza da sostituire?


Risposte:


361

Rails ha un ActiveSupport::CoreExtensions::String::Inflectionsmodulo che fornisce tali metodi. Vale la pena guardarli tutti. Per il tuo esempio:

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

funziona davvero bene! potresti avere qualsiasi parola meteo o no dove sono maiuscole. il parametro lo risolverà.
TheLegend,

c'è un modo per invertire questo, senza usare gsub?
Zack,

@Zack .to_se .humanizedovrebbe fare il lavoro a meno che non sia necessario preservare la piena capitalizzazione.
Tyler Diaz,

Un buon modo per avvicinarsi alla conversione di qualsiasi cosa è essere in grado di fare e annullare un'operazione. .to_sym può convertire una direzione (da stringa a simbolo) e .to_s può convertire (da simbolo a stringa). e se hai a che fare con un array, considera .map (&: to_sym) o .map (& to_s) per convertire tutti gli elementi.
Jasonleonhard,

2
parameterize ('_'). to_sym è un po 'più corto di parameterize.underscore.to_sym.
IAmNaN,

228

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

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

Restituisce il simbolo corrispondente a str, creando il simbolo se non esisteva in precedenza. Vedere Symbol#id2name.

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

Questo può anche essere usato per creare simboli che non possono essere rappresentati usando la :xxxnotazione.

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

Ma per il tuo esempio ...

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

dovrei andare ;)


1
Esempi brillanti. Grazie.
Paul,

8
Il poster originale potrebbe essere stato contento della risposta di Rails, ma questo post risponde alla domanda effettiva posta.
Russ Bateman,

2
Non è vero che "[ to_sym] può anche essere usato per creare simboli che non possono essere rappresentati usando la notazione: xxx". :'cat and dog'è lo stesso di 'cat and dog'.to_sym.
Michael Dorst,

2
Si possono anche fare cose così stravaganti come :"cat and dog\n on a new line"senza la necessità to_sym.
Michael Dorst,

3
La domanda riguardava la conversione in Ruby, non in Rails. Questa è una risposta corretta
Katarzyna,



11

In Rails puoi farlo usando il underscoremetodo:

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

Il codice più semplice sta usando regex (funziona con Ruby):

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

3
questo funzionerà solo se tutte le parole iniziano con una maiuscola, se fosse "il mio cane grasso" tornerà: myfat_dog.
TheLegend,


1

Questo non risponde alla domanda stessa, ma ho trovato questa domanda cercando la soluzione per convertire una stringa in simbolo e usarla in un hash.

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}

Spero che aiuti qualcuno come me!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.