Загрузка файла Remotipart с указанием NaN в качестве кода ответа

Я использую remotipart для загрузки файла с ajax в моем приложении rails. Я использую jquery-ujs Ajax "глобальные" события ajax:success а также ajax:error в моем JavaScript, чтобы вызвать код на успех или неудачу. Проблема в том, что обратный вызов ошибки всегда срабатывает и никогда не приводит к успеху.

Я вижу на вкладке сети инструментов разработчика, что запрос возвращает статус 200 OK.

Это моя форма, где запускается удаленная загрузка.

= form_tag({ action: 'import' }, html: { multipart: true },  class: 'csv_import_form', remote: true, data: { type: :json }) do

Мой контроллер обрабатывает запрос как json и выдает ответ json:

def import
  render json: { some: 'sample json' }
end

и вот как выглядит тело ответа, как видно из инструментов разработчика:

<textarea data-type="application/json" data-status="200" data-statusText="OK">{"some":"sample json"}</textarea>

Remotipart оборачивает ответ в текстовую область. Обратите внимание, что он включает в себя data-status="200"

Вот JavaScript:

$(function() {

  $(document).on("ajax:success", ".csv_import_form", function(event, data, status, xhr)  {

    // does not get here

  }).on("ajax:error", ".csv_import_form", function(event, xhr, status, error) {
      console.log("status code: " + xhr.status);
      console.log("json: " + xhr.responseText);
      console.log("status text: " + xhr.statusText);
      console.log("status: " + status);
      console.log("error: " + error);
  });
});

Вот что я вижу в консоли:

status code: NaN
json: {"some":"sample json"}
status text: OK
status: OK
error: OK

Кажется, что фактический ответ Textarea неправильно анализируется. Даже если он имеет data-status="200", он анализируется как NaN и, таким образом, вызывает обратный вызов ошибки.

Кто-нибудь видел это?

С помощью:

rails 4.0.13
remotipart 1.2.1
jquery 1.7.2

Спасибо

1 ответ

Оказалось, что хотя я обновил remotipart gem до последней версии (1.2.1 в это время), включенные файлы javascript устарели.

Чтобы исправить я удалил:

app/assets/javascripts/jquery.remotipart.js

а также

app/assets/javascripts/jquery.iframe-transport.js

и вместо этого добавил

//= require jquery.remotipart

к моему application.js файл, и тогда все заработало как положено.

Другие вопросы по тегам