Convertir cadena a símbolo capaz en Ruby
Los símbolos suelen representarse así.
:book_author_title
pero si tengo una cadena:
"Book Author Title"
¿Existe una forma integrada en Rails/Ruby para convertirlo en un símbolo donde pueda usar la :
notación sin simplemente reemplazar una expresión regular de cadena sin formato?
Rails obtuvo ActiveSupport::CoreExtensions::String::Inflections
un módulo que proporciona dichos métodos. Vale la pena mirarlos todos. Para tu ejemplo:
'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
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 existía anteriormente. 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 :xxx
notación.
'cat and dog'.to_sym #=> :"cat and dog"
Pero por tu ejemplo...
"Book Author Title".gsub(/\s+/, "_").downcase.to_sym
debería ir ;)
"Book Author Title".parameterize('_').to_sym
=> :book_author_title
http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize
parametrizar es un método de rieles y le permite elegir cuál desea que sea el separador. Es un guión "-" por defecto.
En Rails puedes hacer esto usando underscore
el método:
"Book Author Title".delete(' ').underscore.to_sym
=> :book_author_title
El código más simple usa expresiones regulares (funciona con Ruby):
"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title