##環境
- ruby歴 初心者
- rails5
- ruby 2.4.1p111
- jquery
- coffee
##これはなに?
rails のヘルパーメソッドである simple_fomart を使用した際に、改行コードが変換されずハマってしまった時の備忘録です。
※つっこみどころは満載だと思うのでコメントお待ちしています。
##発端
まず、下記のような ajax での処理中にエラーが発生した場合
そのエラー内容を表示させるコードから始まります。
@error_message = 'ファイルが見つかりませんでした。入力情報に間違いがないか確認してください。'
$('#form_error .modal-body').empty()
$('#form_error .modal-body').append("<%= j @error_message %>")
「あかん、2文で1行とかキモい。」
「改行しよ。」
@error_message = 'ファイルが見つかりませんでした。\n入力情報に間違いがないか確認してください。'
$('#form_error .modal-body').empty()
$('#form_error .modal-body').append("<%= j @error_message %>")
「あれ?なんで改行されてへんのや?」
「そうか!HTMLやねんから改行コードやなくて改行タグにせなあかんのか」
「あれ....てことは、文字列内にタグ埋め込まなあかんのん?」
「あかんあかん、かっこわるいわ」
「そんな君にはsimple_fomartや! 」
「まじ、これ rails 神」
@error_message = 'ファイルが見つかりませんでした。\n入力情報に間違いがないか確認してください。'
$('#form_error .modal-body').empty()
$('#form_error .modal-body').append("<%= j simple_format @error_message %>")
「変換されてへんやんけ」
「当たり前や、文字列の定義が間違うとるんや」
「なんやて?」
##rubyで文字列リテラルでのシングルクオートとダブルクオートは処理が異なる
まだ、初心者故に '〇〇' と "〇〇" の使い分けをほとんど意識していませんでした。
だいたいが、変数を埋め込むときは "〇〇" で、それ以外は '〇〇' というレベルでした。
しかし、それぞれにはもちろん意味がありました。
-
シングルクオート
文字列として定義 -
ダブルクオート
文字列中のバックスラッシュ記法や式を解釈できる文字列として定義
■ 文字列中にバックスラッシュを含む場合
# シングルクオート
[1] pry(main)> string = '私の趣味はカードゲームです。\nフットサルもします。'
=> "私の趣味はカードゲームです。\\nフットサルもします。" #ただの文字列
# ダブルクオート
[2] pry(main)> string = "私の趣味はカードゲームです。\nフットサルもします。"
=> "私の趣味はカードゲームです。\n" + "フットサルもします。" #改行が解釈された文字列
■ 文字列中に式を含む場合
[7] pry(main)> var = 'フットサル'
=> "フットサル"
# シングルクオート
[8] pry(main)> string = '私の趣味はカードゲームです。#{var}もします。'
=> "私の趣味はカードゲームです。\#{var}もします。" #ただの文字列
# ダブルクオート
[9] pry(main)> string = "私の趣味はカードゲームです。#{var}もします。"
=> "私の趣味はカードゲームです。フットサルもします。" #変数が解釈された文字列
ですので、コードを見直すと シングルクオート で定義したことが原因となり
改行コードが解釈されず、結果的に変換さていなかったということになります。
##解決
# ダブルクオートで文字列を定義!!
@error_message = "ファイルが見つかりませんでした。\n入力情報に間違いがないか確認してください。"
$('#form_error .modal-body').empty()
$('#form_error .modal-body').append("<%= j simple_format @error_message %>")
##学んだこと
- バックスラッシュ記法を解釈させるにはダブルクオートで文字列を定義すること
- HTMLで複数行表示したい場合はsimple_fomartを使えば便利
##参考リンク