#はじめに
以前、JQueryのautocomplete、ajax、そしてhttpclientを使いオートコンプリートを実装したが、内容についてぼんやりとしか把握できていなかった。リファクタリングを行いつつ、内容を確認していく。
まず、外部APIにアクセスしている部分は、クラスに切り出し、libディレクトリに入れる。
lib/api_suggest.rb
require 'httpclient'
require 'json'
class ApiSuggest
API_KEY = Rails.application.credentials.api[:API_KEY]
API_URI = Rails.application.credentials.api[:API_URI]
def self.suggest(keyword, max_num)
uri = API_URI
headers = {
Authorization: "Bearer #{API_KEY}",
}
params = {
keyword: keyword,
max_num: max_num,
}
client = HTTPClient.new
req = client.get(uri, body: params, header: headers)
req
end
end
リファクタリング前は、
client = HTTPClient.new
req = client.get(uri, body: params, header: headers)
res = JSON.parse(req.body)
res
と、JSON.parse(req.body)
を行っていたが、
リファクタリング後は、
req = client.get(uri, body: params, header: headers)
client.getした結果をであるreq
部分をそのままコントローラーに返し、
コントローラー側では、
app/controllers/suggests_controller.rb
require 'api_suggest'
class SuggestsController < ApplicationController
SUGGEST_MAX_COUNT = 5
def search
@suggests = ApiSuggest.suggest(params[:keyword], SUGGEST_MAX_COUNT)
render body: @suggests.body, status: @suggests.code
end
end
7行目の、renderで、
render body: @suggests.body, status: @suggests.code
各パラメータに入れる事でJSON.parse
する必要がなくなった。
そして、そのパラメータが、
app/assets/javascripts/suggest.js
$("#form").autocomplete ({
source: function (req, res) {
$.ajax({
url: '/suggest',
type: 'GET',
cache: false,
dataType: "json",
data: { keyword: req.term },
n success: function (data) {
res(data);
},
error: function (xhr, ts, err) {
n res(xhr, ts, err);
}
});
}
});
ajaxのsuccess以下に返されるという流れになっている。
##全体の流れを確認
ajaxのオプションで指定している
url: '/suggest'
にリクエストが送られ、
ルーティングで
get 'suggest', to: 'suggests#search'
app/controllers/suggests_controller.rb
のsearchメソッドが呼ばれ、
def search
@suggests = ApiSuggest.suggest(params[:keyword], SUGGEST_MAX_NUM)
render body: @suggests.body, status: @suggests.code
end
ApiSuggest.suggest
によりhttpclientでの外部APIリクエストを介した結果、
render body: @suggests.body, status: @suggests.code
が返されて、
app/assets/javascripts/suggest.js
のajax
success: function (res) {
resp(res);
},
error: function (xhr, ts, err) {
resp(xhr, ts, err);
}
成功、失敗それぞれのケースに返される。
という流れ。
##ajax部分について詳しく
render bodyのオプションが、戻り値の本体を返していて、
statusがステータスコード(200, 404, 500など)の外部APIの結果が返される。
ajax側でそれを受け取ると、
ajaxの中では、そのstatus codeを参照して、200系、300系を正常として判定して、success側を実行。
それ以外のstatus codeがきたらerror側を実行、
という処理を行っている。
以上。
#終わりに。
最後まで読んで頂きありがとうございます
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。