Auparavant, j'ai implémenté la saisie semi-automatique en utilisant la saisie semi-automatique de JQuery, ajax et httpclient, mais je ne pouvais en saisir que vaguement le contenu. Vérifiez le contenu lors de la refactorisation.
Tout d'abord, découpez la partie accédant à l'API externe dans une classe et placez-la dans le répertoire 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
Avant de refactoriser
client = HTTPClient.new
req = client.get(uri, body: params, header: headers)
res = JSON.parse(req.body)
res
Et, je faisais JSON.parse (req.body)
,
Après refactoring
req = client.get(uri, body: params, header: headers)
Renvoie la partie req
qui est le résultat de client.get au contrôleur tel quel,
Du côté du contrôleur 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
Sur la 7ème ligne, rendez,
render body: @suggests.body, status: @suggests.code
En le mettant dans chaque paramètre, il n'est plus nécessaire de JSON.parse
.
Et ce paramètre est 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);
}
});
}
});
Le flux est qu'il est renvoyé en dessous du succès d'ajax.
Spécifié par l'option ajax ʻUrl: Une demande a été envoyée à '/ suggest'`, Par routage
get 'suggest', to: 'suggests#search'
ʻLa méthode de recherche de app / controllers / suggestionss_controller.rb` est appelée,
def search
@suggests = ApiSuggest.suggest(params[:keyword], SUGGEST_MAX_NUM)
render body: @suggests.body, status: @suggests.code
end
ʻApiSuggest.suggest` entraîne une requête d'API externe sur httpclient
render body: @suggests.body, status: @suggests.code
Est retourné,
ʻApp / assets / javascripts / suggestions.js` ajax
success: function (res) {
resp(res);
},
error: function (xhr, ts, err) {
resp(xhr, ts, err);
}
Il est retourné dans chaque cas de succès et d'échec. Le flux.
L'option render body renvoie le corps de la valeur de retour, Renvoie le résultat d'une API externe dont l'état est un code d'état (200, 404, 500, etc.).
Lorsque vous le recevez du côté ajax, En ajax, reportez-vous au code d'état, évaluez les séries 200 et 300 comme d'habitude et exécutez le côté succès.
Si un autre code d'état est reçu, exécutez le côté erreur, Est en cours de traitement.
c'est tout.
Merci d'avoir lu jusqu'au bout: bow_tone1: J'apprends les rails à partir d'un état inexpérimenté parce que je change de travail. Je veux acquérir régulièrement les bonnes connaissances et devenir un ingénieur compétent. Alors que je continue à publier, je pense que les contributions pour cela augmenteront inévitablement, conduisant à la croissance. Pour le moment, je ne peux pas trouver d'excuses simplement parce que je suis un débutant, mais je pense qu'il y a beaucoup de choses qui ne vont pas avec le contenu du message et que je devrais ajouter, alors j'apprécierais que vous puissiez le signaler. Merci d'avoir lu cet article.
Recommended Posts