Convert string to symbol-able in ruby
Symbols are usually represented as such
:book_author_title
but if I have a string:
"Book Author Title"
is there a built in way in rails/ruby to convert it into a symbol where I can use the :
notation without just doing a raw string 开发者_开发百科regex replace?
Rails got ActiveSupport::CoreExtensions::String::Inflections
module that provides such methods. They're all worth looking at. For your example:
'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
from: http://ruby-doc.org/core/classes/String.html#M000809
str.intern => symbol
str.to_sym => symbol
Returns the Symbol corresponding to str
, creating the symbol if it did not previously exist. See Symbol#id2name
.
"Koala".intern #=> :Koala
s = 'cat'.to_sym #=> :cat
s == :cat #=> true
s = '@cat'.to_sym #=> :@cat
s == :@cat #=> true
This can also be used to create symbols that cannot be represented using the :xxx
notation.
'cat and dog'.to_sym #=> :"cat and dog"
But for your example ...
"Book Author Title".gsub(/\s+/, "_").downcase.to_sym
should go ;)
"Book Author Title".parameterize('_').to_sym
=> :book_author_title
http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize
parameterize is a rails method, and it lets you choose what you want the separator to be. It is a dash "-" by default.
intern → symbol Returns the Symbol corresponding to str, creating the symbol if it did not previously exist
"edition".intern # :edition
http://ruby-doc.org/core-2.1.0/String.html#method-i-intern
Is this what you're looking for?:
:"Book Author Title"
:)
In Rails you can do this using underscore
method:
"Book Author Title".delete(' ').underscore.to_sym
=> :book_author_title
The simpler code is using regex (works with Ruby):
"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title
This is not answering the question itself, but I found this question searching for the solution to convert a string to symbol and use it on a 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}
Hope it helps someone like me!
精彩评论