Rails form_for 'submit' не делает никаких запросов - PullRequest
0 голосов
/ 18 марта 2020

У меня есть страница просмотра рельсов, которая отображает таблицу, в которой каждая строка является формой обновления пользователя. Чтобы отправить форму, вы должны установить флажок «отправить форму». Затем флажок добавляет «отправляемый» в список классов этой формы. Когда кнопка «обновить все» нажата, она использует jquery, чтобы вернуть коллекцию всех форм с классом «submittable», затем перебирает каждую форму и отправляет их, используя функцию submit () jquery. Это все хорошо, работает хорошо, как и ожидалось.

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

Однако - после использования опции фильтра состояния кнопка «обновить все» больше не работает. Он пытается отправить запрос «сообщение» и возвращает ошибку «маршрут не найден». Функция обновления будет работать только после обновления страницы.

Осматривая страницу, выглядит, как если бы форма была такой, как вы ожидаете, идентичной отправке при загрузке страницы fre sh, со всеми входами, присутствующими и правильно вложенными, включая скрытый ввод "patch". Однако использование отладчика в функции submitAll показывает, что отправляемый elem больше не содержит входных данных формы, а проверка вкладки «Сеть» в разделе «Заголовки» не показывает никаких отправляемых данных формы. Я думал, что проблема может быть вызвана jquery submit (), но когда я добавляю ввод f.submit, это также завершается ошибкой после использования фильтра состояния. Он даже не отправляет запрос, ничего не происходит, когда вы нажимаете кнопку вообще.

Любые идеи относительно того, что может нарушить мою форму, отправьте?

Вот представление, содержащее фильтр состояния и форму:

- status_options = User::SEARCH_STATUS_RANKING
  - status_options.each do |status|
    = link_to status, admin_unhandled_deposits_positive_enterprise_settlements_path(params.merge(status: status)), class: ['status', status]

button#update_all_button
   | Update

= simple_form_for user, url: update_user_status_admin_user_url(user), method: :patch, remote: true do |f|
    = f.simple_fields_for :review_reason do |rr|
        = f.input :status, label: false, collection: row[:statuses_for_select], include_blank: false
        = rr.input :reason_type, label: false, collection: review_reasons, required: true 
        = check_box_tag :form_submit, true, false, id: "submit_checkbox"


javascript: 

var submitCheckbox = document.getElementById("#submit_checkbox");
        submitCheckbox.addEventListener('change', selectFormForSubmit);
        const thisForm = document.getElementById("#status_form");

        function selectFormForSubmit() {
            if (this.checked) {
                thisForm.classList.add('submittable')
            } else {
                thisForm.classList.remove('submittable')
            }
        }
var submitAllButton = document.getElementById("update_all_button");
submitAllButton.addEventListener('click', submitAll);

function submitAll() {
    $('.submittable').each( function(index, value){
      const elem = $(value);
      elem.trigger('submit.rails');
    })
  }

Это действие контроллера:

  def positive_enterprise_settlements
    report_date = params[:settlements_created_on] || Date.today
    @report = PositiveEnterpriseSettlementsReport.new(settlements_created_on: report_date, user_status: params[:status])
    @report.build
  end

1 Ответ

0 голосов
/ 19 марта 2020

Здесь есть две большие проблемы. Во-первых, id = "submit_checkbox" может быть не уникальным на странице. Вместо этого используйте классы, чтобы подключить JavaScript к.

Во-вторых, этот JavaScript неидемпотентен - вы подключаете обработчики событий непосредственно к элементам, чтобы при замене содержимого страницы на турболинки или любой другой ajax запрос, что обработчики ушли с элементами, к которым вы их прикрепили.

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

= simple_form_for user, url: update_user_status_admin_user_url(user), method: :patch, remote: true, html: { class: "my-special-form"} do |f|
    = f.simple_fields_for :review_reason do |rr|
        = f.input :status, label: false, collection: row[:statuses_for_select], include_blank: false
        = rr.input :reason_type, label: false, collection: review_reasons, required: true 
        = check_box_tag :form_submit, true, false
function submitAll() {
  $('.my-special-form').each(function(){
    if (this.elements["form_submit"].checked){
      $(this).trigger('submit.rails');
    }
  });
}

$(document).on('click', '#update_all_button', submitAll);

ИМХО Я не понимаю, почему вы делаете это в первую очередь, поскольку вы делаете N число ajax звонит в любом случае. Почему бы просто не иметь кнопку на каждой форме, которая отправляет ее, вместо того, чтобы заставлять пользователя прыгать, хотя дополнительные h oop?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...