Использование вызова Select2 Ajax с Ruby на Rails и ElasticSearch - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь реализовать поиск select2 для динамического получения результатов на основе введенных пользователем данных.

Когда пользователь печатает, он должен отправить запрос GET к действию, которое выполняет запрос к ElasticSearch, затем ElasticSearch должен вернуть количество объектов, которые я могу преобразовать в JSON.

Я не вижу результатов, отображаемых под полем поиска select2, даже если запрос выполняется к ElasticSearch, и он возвращает результаты на основе данных пользователей.

DashboardController.rb

def card_search
    if params[:query].present?
      cards = Elasticsearch::Model.search(params[:query]).records.first(1)
      hash = {}
      hash["results"] = cards.map{|v| v.serializable_hash(only: [:name]) }
      render json: hash.to_json
    else
      render json: []
    end
end

панель инструментов. html .erb

$(".js-data-example-ajax").select2({
  ajax: {
    url: "/dashboard/card_search",
    dataType: 'json',
    type: "GET",
    delay: 250,
    data: function (term, page) {
      return {
        query: term,
        page: page
      };
    },
    formatResult: function (item) { return item.name; },
    formatSelection: function (item) { return item.name; },
    results: function (data, page) {
      return data;
    },
    cache: true
  },
  placeholder: 'Search for a card',
  minimumInputLength: 1,
});

Параметры успешно передаются в контроллер из javascript:

Параметры: {"query" => "Charizard "," page "=>" 1 "}

ElasticSearch создает массив результатов, который преобразуется в JSON:

" {\ "results \": [{\ "name \": \ "Charizard \"}]} "

Когда ElasticSearch возвращает массив, и JSON возвращается к вызову AJAX, возникает эта ошибка:

select2.min.self-65a8000f26302b289c7ae3bdc1ef1831667c2613a3f8f9896177bb441612e583.js?body=1:22 Uncaught TypeError: Cannot read property 'toUpperCase' of undefined

1 Ответ

0 голосов
/ 08 февраля 2020

Решено!

Я понял, что у меня JSON в неправильном формате, хотя я следовал официальной документации select2: https://select2.org/data-sources/formats

Так что вместо этого хранения моих данных в ха sh и последующего преобразования их в json.

. Я перебрал свои результаты из ElasticSearch и сохранил каждый результат в массиве. Затем я преобразовал этот массив в json, а затем вернул его обратно в вызов AJAX.

def card_search
    if params[:query].present?
      cards = Elasticsearch::Model.search(params[:query]).records.first(1)
      array = []

      cards.each do |c|
        array << c
      end

      render json: array.to_json
    else
      render json: []
    end
end

Мне также пришлось изменить способ форматирования результатов на инициализаторе select2. Мне нужно было l oop для каждого элемента данных и указать идентификатор и текст каждого результата, чтобы select2 мог его отобразить.

results: function (data) {
  var results = [];
  $.each(data, function(index, item){
    results.push({
      id: item.id,
      text: item.name
    });
  });
  return {
      results: results
  };
},
...