LoginSignup
0
3

More than 3 years have passed since last update.

非同期通信の実装手順

Posted at

背景

意外とよく使う非同期通信の実装手順を記しておくことで、参考にして実装効率が上がると考えたため。

手順

1.Gemfileに以下を記述する。

gem 'jquery-rails'

忘れずに実行する。


bundle install

2.application.jsに、以下を記述する。

application.js

//= require jquery    // //=require_tree.より上に記述する。

3.コントローラーにフォーマット毎の条件分岐を書く

users_controller.rb

def index
  @users = User.where(['name LIKE ?', "%#{params[:keyword]}%"] ).where.not(id: current_user.id).limit(10)
  respond_to do |format|
    format.html
    format.json
  end
end

4.コントローラーに対応するJavaScriptファイルを作成する。
[例]users.js

5.ajaxでリクエストを送るコードを書く。

users.js

$(function(){
  $('セレクタ名').on('submit', function(e){
    e.preventDefault();           // 自動でリロードする機能をオフにしている
    var formData = new FormData(this);  // フォームで入力したデータを変数に入れている
    var url = $(this).attr("action")   // URLを変数に入れている
    $.ajax({
      url:url,
      type:"POST",
      data:formData,
      dataType:"json",
      processData:false,          // FormData使用時に書くもの
      contentType:false           // FormData使用時に書くもの
    })

6.アクション名に対応するjbuilderファイルを作成し、欲しい情報を記述する。
[例]index.jbuilder

index.jbuilder

json.array! @users do |user|   # 配列にする際はarray!メソッドを使用する
  json.id user.id
  json.name user.name
end

7.通信成功時と失敗時の処理を書く。

users.js
    (中略) // ajaxの記述終了
    .done(function(data){                 // ajaxのデータ
      var 変数 = buildHTML(data);
      $('追加先のセレクタ').append(変数);          // 情報を追加
      $('入力していた部分のセレクタ').val('');        // 中身をリセット
    })
    .fail(function(){
      alert('error');
    })

8.HTMLに追加するための関数を定義しておく

  function buildHTML(comment){
    var html = `追加したいHTMLの場所`
    return html;

完成形

users.js


$(function() {
  function addUser(user) {
    let html = `
      <div class="chat-group-user clearfix">
        <p class="chat-group-user__name">${user.name}</p>
        <div class="user-search-add chat-group-user__btn chat-group-user__btn--add" data-user-id="${user.id}" data-user-name="${user.name}">追加</div>
      </div>
    `;
    $("#user-search-result").append(html);
  }

  function addNoUser() {
    let html = `
      <div class="chat-group-user clearfix">
        <p class="chat-group-user__name">ユーザーが見つかりません</p>
      </div>
    `;
    $("#user-search-result").append(html);
  }
  function addDeleteUser(name, id) {
    let html = `
    <div class="chat-group-user clearfix" id="${id}">
      <p class="chat-group-user__name">${name}</p>
      <div class="user-search-remove chat-group-user__btn chat-group-user__btn--remove js-remove-btn" data-user-id="${id}" data-user-name="${name}">削除</div>
    </div>`;
    $(".js-add-user").append(html);
  }
  function addMember(userId) {
    let html = `<input value="${userId}" name="group[user_ids][]" type="hidden" id="group_user_ids_${userId}" />`;
    $(`#${userId}`).append(html);
  }
  $("#user-search-field").on("keyup", function() {
    let input = $("#user-search-field").val();
    $.ajax({
      type: "GET",
      url: "/users",
      data: { keyword: input },
      dataType: "json"
    })
      .done(function(users) {
        console.log(users)
        $("#user-search-result").empty();
        if (users.length !== 0) {
          users.forEach(function(user) {
            addUser(user);
          });
        } else if (input.length == 0) {
          return false;
        } else {
          addNoUser();
        }
      })
      .fail(function() {
        alert("通信エラーです。ユーザーが表示できません。");
      });
  });

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3