Автозаполнение и Axios - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь создать форму автозаполнения с помощью axios, и я не могу найти способ обмена данными между рельсами и моей формой

вот моя форма:

 <div class="row">
  <div class="col s12">
    <div class="row">
      <div class="input-field col s12">
        <i class="material-icons prefix">textsms</i>
        <input type="text" id="autocomplete-input" class="autocomplete" onkeyup="valueChange(this);">
        <label for="autocomplete-input">Autocomplete</label>
      </div>
    </div>
  </div>
</div>

Здесьмой javascript:

<script>
    document.addEventListener('DOMContentLoaded', function() {
        var elems = document.querySelectorAll('.autocomplete');
        var instances = M.Autocomplete.init(elems, null);
    });

    function valueChange(elem) {
        var instance = M.Autocomplete.getInstance(elem);

        console.log("search for " + elem.value);
        axios.post("<%= test_autocomplete_search_path %>", {
            search: elem.value,
            authenticity_token: '<%= form_authenticity_token %>',
        })
            .then(function (response) {
                instance.updateData(response.data.nom_commune);
                console.log(response.data.nom_commune);
            })
            .catch(function (error) {
                alert(error);
            });
    };
</script>

Вот мой рубин:

def autocomplete_search
    towns = Town.select(:nom_commune).where("nom_commune ILIKE ?", "%#{params[:search]}%")
    render :json => towns.map  { |town| {
        name: town.nom_commune,
        placeholder: nil
      }
    }

проблема в автозаполнении, кроме элементов, сформированных таким образом:

data: {
        "Apple": null,
        "Microsoft": null,
        "Google": 'https://placehold.it/250x250'
      },

, и у меня естьон отформатирован в формате «json». Я не хочу зацикливаться и тратить впустую время процессора, чтобы изменить его, является ли это причудливым способом 1 / правильно передать для сервера ИЛИ 2 / правильно получить его на стороне клиента?

спасибо

greg

1 Ответ

0 голосов
/ 25 мая 2018

Ответ:

<script>
    document.addEventListener('DOMContentLoaded', function() {
        var elems = document.querySelectorAll('.autocomplete');
        var instances = M.Autocomplete.init(elems, {});
    });

    function valueChange(elem) {
        var instance = M.Autocomplete.getInstance(elem);

        console.log("search for " + elem.value);
        axios.post("<%= test_autocomplete_search_path %>", {
            search: elem.value,
            authenticity_token: '<%= form_authenticity_token %>',
        })
        .then(function (response) {
            var map = new Object();
            for (bcl = 0; bcl < response.data.length; bcl ++) {
                map[response.data[bcl].town] = null;
            }
            if (response.data.length > 0) {
                console.log(map);
                instance.updateData(map);
            }
        })
        .catch(function (error) {
            alert(error);
        });
    };
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...