はじめに
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に検索したいキーワードを入力をすると非同期通信での取得、表示がされる。