textareaの改行を非同期で反映させる

## この記事の内容
簡単なブログ投稿サイトを作りました。
非同期通信でブログ投稿した際に、改行が反映されなくなってしまったので、それを解決した方法を備忘録も兼ねて記事にします。

ご指摘等ございましたらコメントをお願いいたします。

## 作ったもの
![blogapp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427185/6227532a-d73e-8f53-2008-2f1f744a71d3.gif)
簡単なブログ投稿サイトです。

* Ruby、Rails、jQuery
* Bootstrap

### 投稿フォーム

```haml
= form_for @blog do |f|
  .form
    = f.text_area :content, placeholder: "#{@blog.content}", class: "form__text"
    = f.label :image, class: "form__file" do
      = fa_icon 'image'
    = f.file_field :image, class: "form__file--default"
    = f.submit "投稿", class: "btn btn-primary form__btn"
```
ブログなので、text_fieldではなくtext_areaで改行ができるようにしました。
画像投稿ボタンは、[前回の記事](https://qiita.com/fumikao/items/59ab20af33047d06e6e3)
の復習も兼ねてfontawesomeを使っています。

### 投稿表示（リロード時）
```haml
.card
  .card-body
    %h5.card-title
      = blog.user.name
    %h6.card-subtitle.mb-2.text-muted
      = blog.created_at.strftime("%Y/%m/%d(%a) %H:%M")
    %p.card-text
      = simple_format(blog.content)
      - if blog.image?
        = image_tag(blog.image)
    - if user_signed_in?
      = link_to "コメント(#{blog.comments.length})", blog_path(blog), class: "card-link"
      - if blog.user == current_user
        = link_to "編集", edit_blog_path(blog), class: "card-link"
        = link_to "削除", "/blogs/#{blog.id}", method: :delete, class: "card-link"
```
リロードした時には`simple_format`を使っているので改行が反映されます。

### 非同期での投稿
当初このようなコードを書いていたのですが、改行が反映されませんでした。

```js
$(function(){
  function buildHTML(blog){
    var content = blog.content ? `${blog.content}` : "";
    var image = blog.image ? `<img src=${blog.image}>` : " ";
    var html = `<div class="card">
                  <div class="card-body">
                    <h5 class="card-title">
                      ${blog.user_name}
                    </h5>
                    <h6 class="card-subtitle mb-2 text-muted">
                      ${blog.created_at}
                    </h6>
                    <p class="card-text">
                    </p>
                    <p>${content}</p>
                    <p>${image}</p>
                    <a class="card-link" href="/blogs/${blog.id}">コメント(0)</a>
                    <a class="card-link" href="/blogs/${blog.id}/edit">編集</a>
                    <a class="card-link" rel="nofollow" data-method="delete" href="/blogs/${blog.id}">削除</a>
                  </div>
                </div>`;
    return html
  }
  
  $('#new_blog').on('submit', function(e){
    e.preventDefault();
    var formData = new FormData(this);
    $.ajax({
      url: '/blogs',
      type: 'POST',
      data: formData,
      dataType: 'json',
      processData: false,
      contentType: false
    })
    .done(function(data){
      var html = buildHTML(data);
      $('.blogs').prepend(html);
      $('#new_blog')[0].reset();
    })
    .fail(function(){
      alert('送信に失敗しました')
    })
    .always(function(){
      $('input[type=submit]').removeAttr("disabled");
    })
  });
});
```
formがsubmitされたら非同期通信をして、buildHTMLでHTMLを作成し、blogの一番上に加える、という流れです。

注目すべきはbuildHTML内の記述です。

試しに
test
test
test
と投稿して、検証ツールで確認したところ、contentは以下のような形になっていました。

```html
<p>test
test
test</p>
```
HTMLでは改行は無視されてしまいます。明示的にするためには`<br>`で改行を示してあげないといけません。

そこで、formで送られる改行コードを`<br>`に置き換える記述を追加しました。
html内のcontentをtextに変更しています。

```js
function buildHTML(blog){
    var content = blog.content ? `${blog.content}` : "";
    // 改行コード \n|\r\n|\r を <br> に置き換える
    var text = content.replace(/\n|\r\n|\r/g, '<br>');
    var image = blog.image ? `<img src=${blog.image}>` : " ";
    var html = `<div class="card">
                  <div class="card-body">
                    <h5 class="card-title">
                      ${blog.user_name}
                    </h5>
                    <h6 class="card-subtitle mb-2 text-muted">
                      ${blog.created_at}
                    </h6>
                    <p class="card-text">
                    </p>
                    <p>${text}</p>
                    <p>${image}</p>
                    <a class="card-link" href="/blogs/${blog.id}">コメント(0)</a>
                    <a class="card-link" href="/blogs/${blog.id}/edit">編集</a>
                    <a class="card-link" rel="nofollow" data-method="delete" href="/blogs/${blog.id}">削除</a>
                  </div>
                </div>`;
    return html
  }
```
これで
test
test
test
という投稿が

```html
<p>test<br>test<br>test</p>
```
このように反映されるようになり、無事改行できました！


#### 参考
改行コード・正規表現について
http://www-creators.com/archives/2551