その他
    ホーム 技術発信 DoRuby その時、改行が半角スペースになった

    その時、改行が半角スペースになった

    この記事はアピリッツの技術ブログ「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/, ‘&#13;&#10;’) %>”>

    これで再度投稿を試みたところ・・・・・
    よし!ちゃんと改行コードとして保存されたぞ。

    ちなみに、「&#13;&#10;」はwindowsの改行コードで、Mac、Unixはそれぞれ
    「&#10;」「&#13;」になるそうです。
    どうせ出力時に<br>タグに変換するため、データベースに保存する改行コードは
    何でも良かったもので。