この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
改行コードとは、まことにややこしきもの。
気付きし時には元の形を留めざる事、少なからずや。
あな、事件はクチコミの確認画面にて起こったのでございました・・・・・
以下、今回の検証環境です。
【機能】
・ASPサービスのクチコミ機能。ユーザのページにティッカーを埋め込むタイプ。
・入力フォームからクチコミを投稿し、確認画面を表示した後、データベースに保存する。
【仕様・条件】
1. ASPサービスである等の諸事情により、セッションは使わない。
2. データベースには、改行コードはタグ変換せずそのまま保存する。
3. フォームが送信された段階で、用意してあったERBテンプレートに入力内容を渡し、
結果を確認画面用htmlとして保存。
4. 確認画面に遷移し表示要求が来たら、3で保存したhtmlの内容を確認画面として返す。
まあ、ごちゃごちゃ書きましたが、簡単に説明すると、
例えば、あらかじめ用意されている確認画面用のテンプレートは以下のようなものです。〜〜 表示部分 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
<table>
<tr>
<td>レビュー</td>
<td><%= (h @review).gsub(/\r\n|\n|\r/, “<br/>”) %></td>
</tr>
</table>
〜〜 フォーム部分 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
<form>
<input type=”hidden” name=”review” value=”<%= h @review %>”>
</form>
@reviewがユーザが入力/送信したレビューの内容です。
表示部分ではレビューの改行コードを<br>タグに変換して出力し、
フォーム部分では本登録用にhiddenで同じ内容を埋め込んでおきます。
このテンプレートに、送られてきた入力内容@reviewが渡され、rubyが実行された結果を
htmlとして保存。確認画面としてそのhtmlをユーザ側のページに返すという仕組みです。
そもそもこのやリ方がダメ!とかあるかと思いますが、
今回はあくまでこの方法でやる場合の検証なので、あしからず。
ていうか、やりたいんで。これで。
さて、この方法で確認画面を表示すると、表示の方はきちんと改行されて表示されました。
で、そのまま投稿ボタンを押して送信し、「投稿ありがとうございました」の完了画面が
出たので、いざ投稿された内容を確認してみると・・・・・
あれ?改行コードが半角スペースになってるぞ?
フォーム送信から確認画面を介さず直接データベースに叩き込んだところ、
その場合はきちんと改行コードのまま保存されてました。
てことは、確認画面にhiddenで埋め込んだところが怪しいっぽい。
html化された時点で改行コードがどうなってるのかは定かじゃありませんが、
いろいろ調べた結果、HTMLユニコード(10進)に変換すれば良さそうだと判明。
hiddenの箇所をこう変更してみた。<input type=”hidden” name=”review” value=”<%= (h @review).gsub(/\r\n|\n|\r/, ‘ ’) %>”>
これで再度投稿を試みたところ・・・・・
よし!ちゃんと改行コードとして保存されたぞ。
ちなみに、「 」はwindowsの改行コードで、Mac、Unixはそれぞれ
「 」「 」になるそうです。
どうせ出力時に<br>タグに変換するため、データベースに保存する改行コードは
何でも良かったもので。