Rails 5.2 - Удаление атрибута data-remote не отправляет форму в виде запроса HTML - PullRequest
0 голосов
/ 05 марта 2019

Я отображаю форму поиска в Rails 5.2.2 и имею логику, которая определяет, должен ли запрос быть запросом AJAX или запросом HTML.Вот как выглядит моя форма:

<form id="form" action="/search" data-prev-query="test" data-remote="true" method="get">
  <input type="text" name="q" id="search_query" value="test">
</form>

Если поисковый запрос отличается от атрибута data-prev-query в форме, я хотел бы, чтобы отправка формы была HTML-запросом, чтобы она перезагрузиласьстраница.В противном случае, я бы хотел, чтобы отправка формы была AJAX-запросом.Вот моя логика для программного удаления свойства data-remote из формы:

$("#form").find("#search_query").change(function(e)
{
  var theForm = $("#form");

  var currentSearchQuery = theForm.find("#search_query").val();
  var prevSearchQuery = theForm.data("prev-query");

  var isRemote = (currentSearchQuery === prevSearchQuery);

  if (isRemote === true)
    theForm.attr('data-remote', isRemote);
  else
    theForm.removeAttr('data-remote');
});

Я подтвердил, что этот код удаляет или добавляет атрибут data-remote, как и ожидалось.Однако даже если атрибут data-remote удален, форма по-прежнему отправляется в виде AJAX-запроса.

Как получить форму для отправки в виде запроса HTML?Кстати, я не использую Turbolinks.

1 Ответ

0 голосов
/ 06 марта 2019

Поскольку @chumakoff поделился в комментарии, я нашел свой ответ на этом ТАК сообщении .Мне также пришлось вызвать removeData('remote'), чтобы очистить внутренний кеш jQuery.Ниже мой обновленный код, который работает.Я помещаю комментарий рядом с добавленными строками.

$("#form").find("#search_query").change(function(e)
{
  var theForm = $("#form");

  var currentSearchQuery = theForm.find("#search_query").val();
  var prevSearchQuery = theForm.data("prev-query");

  var isRemote = (currentSearchQuery === prevSearchQuery);

  if (isRemote === true)
  {
    theForm.removeData('remote'); // ADDED LINE
    theForm.attr('data-remote', isRemote);
  }
  else
  {
    theForm.removeAttr('data-remote');
    theForm.removeData('remote'); // ADDED LINE
  }
});
...