Подтвердить что ты не робот

Приложение Typeahead в rails: добавьте запрос JSON только к одному конкретному запросу вместо добавления запроса JSON к каждому запросу с помощью предварительной выборки

Функциональность типа впереди работает там, где она должна. Проблема в том, что функциональность типа впереди делает запрос JSON для каждого запроса данных, когда он действительно должен выполняться только для одного конкретного запроса.

У меня есть следующий контроллер:

#controllers/agencies_controller.rb
class AgenciesController < ApplicationController

  def get_unique_agency_names
    @unique_agency_names = Agency.uniq.pluck(:name)
    respond_to do |format|
      format.json { render json: @unique_agency_names }
    end
  end
  ...
end

В моем файле javascript есть следующее:

#app/assets/javascripts.agencies/index.js
$(document).ready(function(){
  /* For typeahead functionality on name input of search form for agencies */
  var agency_names = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.whitespace,
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    prefetch: '../agencies/get_unique_agency_names.json'
  });

  $('#prefetch .typeahead.name_input').typeahead(null, {
    name: 'agency_names',
    source: agency_names
  });
});

И только для завершения, вот одно место, где я хочу, чтобы эта функциональность произошла: В этой форме:

# just showing the relevant part of the form
<div class="form-group" id="prefetch">
  <%= f.label :name_cont, "Agency Name" %>
  <%= f.text_field :name_cont, class: "form-control typeahead name_input", placeholder: "Enter Agency Name" %>
</div>

Вот мой соответствующий маршрут в config/routes.rb

resources :agencies do
  collection do
    get 'get_unique_agency_names'
  end
end

Мой конкретный вопрос: как я могу гарантировать, что GET "/agencies/get_unique_agency_names" вызывается только тогда, когда он должен? Сейчас он добавляет этот запрос JSON для каждого запроса. Я хочу, чтобы запрос JSON выполнялся только для одного конкретного запроса.

Twitter Тип Ahead Примеры

4b9b3361

Ответ 1

Я думаю, вам нужно это

  $('#prefetch .typeahead.name_input').typeahead(null, {
    generateOnLoad:false,
    name: 'agency_names',
    source: agency_names
  });

generateOnLoad {boolean}

null (по умолчанию)

Если включено, исходные данные будут сгенерированы (выполнение запроса Ajax и подготовка к поисковым данным) при загрузке страницы вместо ожидания ввода фокуса.

PN: эта опция не работает с динамической: true, если не настроена какая-либо другая конфигурация.

Кроме того, если вы обнаружите, что файл манифеста rails добавляет ваш вызов на каждую страницу, то только элемент проверки существует до привязки типа вперед:

if($('#prefetch .typeahead.name_input').length){
      $('#prefetch .typeahead.name_input').typeahead(null, {
        generateOnLoad:false,
        name: 'agency_names',
        source: agency_names
      });
}

Ответ 2

Я бы предложил стратегию для "ограничения" запросов, а не программное обеспечение единого запроса, поскольку, похоже, вы имеете дело с большим набором данных. Вы можете установить параметр Bloodhounds prefetch для кэширования, что вы можете, и опций sufficient и remote, чтобы гарантировать, что запросы вашего JSON файла будут заполнены и ограничены по скорости. Установите более высокое значение для параметра Typeaheads minLength в качестве последней строки защиты.

Prefetch будет служить вам в определенной степени, так как это зависит от локального хранилища браузеров для кеширования, которое имеет ограниченную емкость. Если ваш набор данных велик, он будет кэшировать только часть, и после инициализации потребуются дополнительные запросы.

Remote обрабатывает запросы после инициализации и может отбросить или заблокировать эти запросы для вас, тем самым уменьшив количество выполненных запросов. См. Параметры url, rateLimitBy и rateLimitWait, которые можно присвоить remote как хэш. Кроме того, Bloodhound будет использовать remote для повторного заполнения дополнительных данных, если ваш достаточный счетчик привязок не будет достигнут.

Наконец, не пропустите null и установите для параметра minLength значение, превышающее значение по умолчанию 1 для вашего конструктора Typeahead. Это предотвратит чрезмерно изобильный поиск в вашем наборе данных. Просто убедитесь, что значение minLength короче длины вашего наименьшего возможного результата.