Rubyで文字列内の\nが改行コードとして認識されないとき

f:id:sktktk1230:20180726121250p:plain

様々な改行コードを統一して\n に変換して、DB保存したいと思ったが、改行コードではなく文字列として保存されてしまいハマりました

最初に書いたコード

str = 'Hello! \nWorld'
str.gsub(/(\\r\\n|\\r|\\n)/, '\n')
User.name = str
User.save!

=> "Hello! \\nWorld"

これだと\n が文字列として保存されてしまいました。
\n は特殊文字だからエスケープとかすればいいのかな?と思い次にこんなコードを書きました

次に試してみたコード

str = 'Hello! \nWorld'
str.gsub(/(\\r\\n|\\r|\\n)/, '\\\\n')

=> "Hello! \\nWorld"

こちらもうまく動かず よく調べてみると

正しく改行されるコード

ダブルクォーテーションにすればよいだけでした

バックスラッシュ記法は文字列をダブルクオーテーションで囲った場合とシングルクオーテーションで囲った場合で扱いが異なります。
引用:バックスラッシュ記法によるエスケープ

str = 'Hello! \nWorld'
str.gsub(/(\\r\\n|\\r|\\n)/, "\n")
User.name = str
User.save!

=> "Hello! \n" + "World"