Отправка формы Rails не происходит в фоновом режиме - PullRequest
0 голосов
/ 21 января 2019

У меня есть приложение Rails 5.2, где я использую form_with, который генерирует этот HTML:

<form id="post-0" class="" action="/posts.js" accept-charset="UTF-8" data-remote="true" method="post">

Форма успешно отправляется в действие create PostController.

  def create
    @post = current_user.account.posts.new(post_params)
    respond_to do |format|
      if @post.save
        format.html { redirect_to posts_path, notice: 'Post added.' }
        format.js { render :create, status: :created }
      else
        format.html { render :index }
        format.js { render :create, status: :unprocessable_entity }
      end
    end
  end

Это равно , тогда рендеринг представления JS:
app / views / posts / create.js.erb

alert('created');

Однаков моем браузере я буквально перенаправлен на http://localhost:3000/posts.js, где он показывает код JavaScript.Это означает, что отправка формы не , кажется, происходит в фоновом режиме.

Я бы ожидал остаться на той странице, на которой была форма, с появлением предупреждения Javascript с надписью"создал".

Есть ли что-то глупое, что я пропустил?Мне кажется, это что-то с form_with, что я не правильно делаю.

Я пытался заменить его на form_for @post, remote: true, format: :js do ..., но с той же проблемой.

На данный момент,Я не могу сказать, есть ли проблема в представлении, которое показывает форму, или в действии контроллера create.Контроллер - это рендеринг create.js.erb, а показанный URL-адрес - http://localhost:3000/posts.js, что, по-видимому, указывает на проблему формы в представлении.

Это приложение - Rails 5.2.Я не уверен, что это актуально, но я удалил конвейер активов для Webpacker, у меня do установлен rails-ujs (так как он показывает диалог подтверждения в этих link_to ссылках, как и ожидалось <%= link_to('Destroy', user, method: :delete, data: { confirm: 'Are you sure?' }) %>

Ответы [ 3 ]

0 голосов
/ 21 января 2019

видел вашу работу на Upwork. Не нужно тратить на это 100 долларов!

<%= form_with url: content_export_path, method: :post, id: 'ce_form1', data: { remote: true } %>

Посмотрите, где находится объявление remote: true ... (внутри хеша данных)

Дайте мне знать, если это работает.

0 голосов
/ 23 января 2019

Отправка формы может происходить локально (т. Е. Не удаленно) по ряду причин.

При использовании form_with могут возникать некоторые распространенные причины локальной отправки.include:

local: true

Атрибут local является необязательным для form_with.Если не указано, form_with будет по по умолчанию установить local: false.

  • true установит форму для отправки локально (стандартная форма отправки),не удаленно / асинхронно.

  • false установит форму для отправки удаленно / асинхронно.

Любое значение, отличное от false(включая :false, который является символом , а не логическим ), будет интерпретироваться как значение, равное true (т.е. отправлять локально).

Отправка формы с использованием Javascript

Несмотря на то, что для атрибута local установлено значение, которое должно инициировать удаленную / асинхронную отправку формы, форма все еще может отправляться локальноесли вы запускаете событие формы submit через Javascript.

В данном примере HTML-код, сгенерированный при использовании form_with, соответствует ожидаемому, поэтому атрибуты, предоставленные form_with, не являютсяпроблема в этом случае.

Если используется JavaScriptред, чтобы отправить форму, это может быть проблемой.Например, даже с data-remote="true" в форме этот javascript будет проблемой:

document.getElementById('form-0').submit();

Это отправляет форму, но не вызывает событие отправки для rails-ujs для перехвата с помощью обработчика событий onsubmit.

Работа с ненавязчивым Javascript-адаптером Rails

Чтобы запуск формы запускался с помощью javascript(используете ли вы jQuery, Stimulus JS или что-то еще), вам нужно использовать механизм, который будет перехватывать rails-ujs (или jquery-ujs ).

Rails предоставляет Rails.fire пользовательскую оболочку события javascript в rails-ujs, которую можно использовать следующим образом:

Rails.fire(document.getElementById('form-0'), 'submit');
0 голосов
/ 21 января 2019

Вы делаете очень основную ошибку. Используя ajax, вы не можете использовать format.js. Этот Ruby модуль используется для перенаправления страницы. вместо этого вы должны использовать render json: { status: 200}

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