文字列をルビで記号可能に変換する


241

シンボルは通常そのように表されます

:book_author_title

しかし、文字列がある場合:

"Book Author Title"

: 生の文字列の正規表現による置換を行わずに記法を使用できる記号に変換する組み込みの方法がrails / ruby​​にありますか?


回答:


360

RailsはActiveSupport::CoreExtensions::String::Inflectionsそのようなメソッドを提供するモジュールを得ました。それらはすべて見る価値があります。あなたの例のために:

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

これは本当にうまくいきます!天気とか、大文字とかではなくても、どんな言葉でもかまいません。parameterizeはそれを整理します。
TheLegend 2012

gsubを使用せずにこれを元に戻す方法はありますか?
ザック2015

@Zack .to_sを使用.humanizeすると、完全な大文字を維持する必要がない限り、この作業を行う必要があります。
タイラー・ディアス

何かを変換するアプローチの良い方法は、操作を実行して元に戻すことができるようにすることです。.to_symは一方向(文字列からシンボル)に変換でき、.to_sは(記号から文字列)に変換できます。配列を処理する場合は、すべての要素を変換するために.map(&:to_sym)または.map(&to_s)を検討してください。
jasonleonhard 2015年

2
parameterize( '_')。to_symは、parameterize.underscore.to_symよりも少し短いです。
IAmNaN 2017

228

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

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

に対応する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

行く必要があります ;)


1
素晴らしい例。ありがとうございました。
ポール

8
元の投稿者はRailsの回答に満足していたかもしれませんが、この投稿は実際に尋ねられた質問に回答しています。
ラスベイトマン2013

2
「[ to_sym]を使用して、:xxx表記では表現できない記号を作成することもできる」というのは正しくありません。:'cat and dog'と同じ'cat and dog'.to_symです。
Michael Dorst

2
:"cat and dog\n on a new line"必要としないような奇妙なことをすることさえできto_symます。
Michael Dorst

3
問題は、RailsではなくRubyでの変換に関するものでした。これが正解です。
Katarzyna 2016



11

Railsでは、次のunderscoreメソッドを使用してこれを行うことができます。

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

より単純なコードは正規表現を使用しています(Rubyで動作します)。

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

3
これは、すべての単語が大文字で始まる場合にのみ機能し、 "my fat Dog"の場合は:myfat_dogを返します。
TheLegend 2012


1

これは質問自体には答えていませんが、この質問は文字列をシンボルに変換してハッシュで使用するための解決策を探していることがわかりました。

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}

それが私のような誰かを助けることを願っています!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.