Загрузка файла 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
файл, и тогда все заработало как положено.