2010-01-05 16 views
198

símbolos son generalmente representada como talcadena Convertir en símbolo, capaz de rubí

:book_author_title 

pero si tengo una cadena:

"Book Author Title" 

es que hay una construida en la forma en rieles/rubí para convertir en un símbolo donde puedo usar la notación : sin solo hacer una regex de cadena sin formato?

+0

En lugar de la conversión, yo Puedes estar interesado en [acceso diferente - métodos que funcionan de manera igual para los parámetros de cadena y símbolo] (http://stackoverflow.com/questions/10780817). –

Respuesta

302

Carriles tiene ActiveSupport::CoreExtensions::String::Inflections módulo que proporciona tales métodos. Todos valen la pena mirar. Para su ejemplo:

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

¡esto funciona realmente bien! podrías tener cualquier palabra meteorológica o no en que se haya Capitalizado. el parámetro lo resolverá. – TheLegend

+0

¿hay alguna manera de revertir esto, sin usar gsub? – Zack

+0

@Zack '.to_s' y' .humanize' deberían hacer el trabajo a menos que necesites conservar las mayúsculas al máximo. –

10

En Rieles usted puede hacer esto utilizando underscore método:

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

El código más simple está usando expresiones regulares (funciona con Ruby):

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

esto solo funcionará si todas las palabras comienzan con mayúscula, si fuera "mi perro gordo" volverá: myfat_dog. – TheLegend

199

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

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

Devuelve el Símbolo correspondiente a str, creando el símbolo si no lo hizo existen evidentemente Ver Symbol#id2name.

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

Esto también se puede utilizar para crear símbolos que no se pueden representar mediante la notación :xxx.

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

Pero por tu ejemplo ...

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

debe ir;)

+1

Brillantes ejemplos. Gracias. – Paul

+7

El póster original puede estar contento con la respuesta de Rails, pero esta publicación responde a la pregunta real. –

+2

No es verdad que "[' to_sym'] también se puede usar para crear símbolos que no se pueden representar con la notación: xxx ". ': 'cat and dog'' es lo mismo que'' cat and dog'.to_sym'. – anthropomorphic

9

Es esto lo que está buscando ?:

:"Book Author Title" 

:)