Ответ 1
Rails получил модуль ActiveSupport::CoreExtensions::String::Inflections
, который предоставляет такие методы. На них все стоит посмотреть. Для вашего примера:
'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
Символы обычно представлены как таковые
:book_author_title
но если у меня есть строка:
"Book Author Title"
Есть ли встроенный способ в rails/ruby, чтобы преобразовать его в символ, где я могу использовать нотацию :
, не заменяя замену регулярного выражения raw?
Rails получил модуль ActiveSupport::CoreExtensions::String::Inflections
, который предоставляет такие методы. На них все стоит посмотреть. Для вашего примера:
'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
Возвращает символ, соответствующий str
, создавая символ, если он ранее не существовал. См. Symbol#id2name
.
"Koala".intern #=> :Koala
s = 'cat'.to_sym #=> :cat
s == :cat #=> true
s = '@cat'.to_sym #=> :@cat
s == :@cat #=> true
Это также можно использовать для создания символов, которые не могут быть представлены с использованием нотации :xxx
.
'cat and dog'.to_sym #=> :"cat and dog"
Но для вашего примера...
"Book Author Title".gsub(/\s+/, "_").downcase.to_sym
должен идти;)
"Book Author Title".parameterize('_').to_sym
=> :book_author_title
http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize
parameterize - это метод rails, и он позволяет вам выбрать то, что вы хотите, чтобы разделитель был. По умолчанию это тире "-".
intern → symbol Возвращает символ, соответствующий str, создавая символ, если он ранее не существовал
"edition".intern # :edition
В Rails вы можете сделать это с помощью метода underscore
:
"Book Author Title".delete(' ').underscore.to_sym
=> :book_author_title
Простейший код использует regex (работает с Ruby):
"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title
Это то, что вы ищете?:
:"Book Author Title"
:)
Это не ответ на сам вопрос, но я нашел этот вопрос в поиске решения для преобразования строки в символ и использования ее в хэше.
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}
Надеюсь, это поможет кому-то вроде меня!