Railsにおける非同期通信


非同期通信(Ajax)とは

ブラウザが再読み込みされること無く通信が行われる通信方法です。
ex.メッセージを投稿→画面をリロードしなくても反映される

JSONとは

データ交換を行うためのデータ記述形式の一種で、キーとバリューの組み合わせでデータを表現します。
AjaxでJSONという型でレスポンスが行われ、ブラウザではJavaScriptが動作しサーバからJSON形式で返されたデータをHTMLにつくりブラウザが書き換えられます。
これらにより、ブラウザの一部だけを更新することができるようになります◎

ポイント
① JavaScriptのメソッドを利用してリクエストを送る。
② コントローラでJSON形式のデータを用意するよう準備(コントローラーにアクション記述)
③ レスポンスするためのJSON形式のデータを準備(json.jbuilder)
④ JavaScriptでレスポンスを受け取り、HTMLを操作して追加


非同期通信の実装

respond_toメソッドを使用します!
リクエストがHTMLか、JSONかを条件分岐してくれます

respond_to do |format|
  format.html { render ... } # HTMLリクエストのときにに呼ばれる
  format.json { render ... } # JSONリクエストのときに呼ばれる
end
  • 以下のようにレスポンスできるようにhogesコントローラーに記述していきます リクエストされたformatによって処理を分けます
def create
  @hoge = モデル名.create(hoge_params)
  respond_to do |format|
    format.html { redirect_to :root }
    format.json { render json: @hoge} #jsファイル側で作成した@hogeを使用するためにrenderメソッドを使用し、作成したhogeをjson形式で返すようにする
  end
end
  • assets/javascripts配下にhoge.jsファイルを作成する

  • 非同期通信でリクエストする

$(function() {
  $('.js-form').on('submit', function(e) {
    e.preventDefault();
    var hoge = $('.js-form__text-field').val();
    $.ajax({
      type: 'POST',
      url: '/hoges',
      data: {
        hoge: {
          content: hoge
        }
      },
      dataType: 'json'
    })
    .done(function(data) {
      var html = $('<li class="hoge">').append(data.content);
      $('.hoges').append(html);
      $('.js-form__text-field').val('');
    })
    .fail(function() {
      alert('error');
    });
  });
});
オプション 詳細
Type HTTP通信の種類を記述する。(GET、POST)
url リクエストを送信する先のURLを記述
data サーバに送信する値を記述する
datatype サーバから返されるデータの型を指定

挙動確認

htmlを生成するvar html = $('

').append(***.content);という処理をメソッドにして切り出します。
$(function() {
  function buildHTML(hoge) {
    var html = $('<li class="hoge">').append(hoge.content);
    return html;
  }

  $('.js-form').on('submit', function(e) {
    e.preventDefault();
    var hoge = $('.js-form__text-field').val();
    $.ajax({
      type: 'POST',
      url: '/hoges',
      data: {
        hoge: {
          content: hoge
        }
      },
      dataType: 'json'
    })
    .done(function(data) {
      var html = buildHTML(data);
      $('.hoges').append(html);
      $('.js-form__text-field').val('');
    })
    .fail(function() {
      alert('error');
    });
  });
});

再度挙動確認して完了です!