0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails ajaxで検索一致したキーワードの取得、表示まで

Last updated at Posted at 2020-07-19

はじめに

Railsで特定のデータベースの一覧を取得から表示までの実装を行なったので、忘れないようにメモしておきたい。

jqueryは少し触れた程度だったので書き方やajax通信についての勉強になった。

サンプルとしてUserテーブルを準備

カラム名 データ型
id integer
name string
created_at datetime
updated_at datetime
{:id=>1, :name=>"山田"}
{:id=>2, :name=>"太郎"}

一覧表示する箇所


 <%= f.text_field :name, class: 'form user-match', required: true %> 
 <p class="search-attention"></p>

#API作成


def index
    keyword = params[:keyword]
    @users = User.where(['name = ?', keyword])
                     .page(params[:page] || 1).per(50)
                     .order(:id)
    render json: @user
  end

ここでは完全一致したものを取得するようにしている。
ルーティングでパスを指定する。
params[:keyword]に太郎という値を渡すと次のようなものが返ってくる。

{:id=>2, :name=>"太郎"}

山田の場合だと

{:id=>1, :name=>"山田"}

#ajaxの実装
user_match.js.erbを作成。


api_match = function (selector, path) {
  $(selector).change(function() {
    const user_name = $(this).val();
    $.ajax({
      url: `指定したurl` + path,
      dataType: "json",      #サーバから返されるデータの型を指定
      data: {keyword: user_name}
    })
    .done(function (data) {  #値が帰ってきたとき
      $(selector).next(".search-attention").empty(); #他のclass(search-attention)と被らないように
      if ($.trim(data)){  #dataが空じゃない時
        $(selector).next(".search-attention").append("<p>" + data[0].name + "</p>");
      };
    });
  });
};
$(window).on("load", function () { # classにevent付与
  api_match(".user-match", 指定したpath)
});

ここで一つはまってしまったのがchangeメソッドを用いているがfunctionを書くことを忘れておりエラーが出ていたので気をつけたい。

これでtext_fieldに検索したいキーワードを入力をすると非同期通信での取得、表示がされる。

0
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?