Rails + ajaxForm: используйте обратный вызов «ошибка» при ошибке загрузки файла

Задний план

Сначала я хотел загрузить файл через json и получить ответ таким же образом.

Я использую:

Вскоре я обнаружил, что вы не можете получить ответ в json . Итак, я следую этому совету и возвращаюсь в виде текста.

Я могу заставить все работать после удаления тегов pre. Уродливое решение, но это уродливая проблема.

Проблема

Теперь моя проблема заключается в обработке ошибок.

Вот JS:

$('form#new_image').submit(function() {
  $(this).ajaxSubmit({
    dataType: 'text',
    beforeSubmit: showLoading,
    success: imageUploadSuccess,
    error: imageUploadError
  });
  return false;
});

function imageUploadSuccess(data) {
  var jsonObject = $.parseJSON((/<pre>(.+)<\/pre>/.exec(data))[1]);
  //Do something
}

function imageUploadError(data) {
  alert("FAIL!");
}

Даже если я отвечаю с ошибкой, обратный вызов успеха (imageUploadSuccess) всегда выполняется.

Вот мой контроллер:

def create
  @image = Image.new params[:file]
  @image.imageable_type = params[:imageable_type]
  @image.imageable_id = params[:imageable_id]

  respond_to do |f|
    if @image.save
      logger.debug "PASSED"
      f.text {render :text => @image.to_json}
    else
      logger.debug "FAIL"
      f.text { render :text => "Fail!", :status => 500 }
    end
  end
end

Теперь, хотя я мог бы вернуть объект json с success: false в нем, когда он терпит неудачу, просто кажется грязным, что обратный вызов успеха всегда выполняется.

Как использовать обратный вызов ошибки?


person Ramon Tayag    schedule 02.03.2011    source источник
comment
вы не должны полагаться на плагин для отправки формы, если это приводит к слишком большим ограничениям. Нужно сделать несколько строк js: предотвратить отправку по умолчанию, сделать вызов ajax с сообщением. Оттуда вы можете справиться с любым делом, которое пожелаете   -  person apneadiving    schedule 02.03.2011


Ответы (2)


Вот некоторый общий код jQuery, чтобы сделать вашу отправку ajax:

$('#btn-submit').click(function(event){
    event.preventDefault();
    $.ajax({
        type: "POST",
      url: $('form').attr('action'),
      data:  $('form').serialize(),
      success: function(data) {},
      error: function(data) {}
    });
});

РЕДАКТИРОВАТЬ:

Я только что увидел, что вы хотите загрузить файл с помощью ajax. Ajax не поддерживает такую ​​обработку, но есть отличные альтернативы.

Я привожу здесь два примера (две ветки): https://github.com/apneadiving/Pic-upload---Crop-in-Ajax

  • с загрузкой с помощью flash
  • с jQuery Uploader, 100% js (с использованием фреймов)
person apneadiving    schedule 02.03.2011
comment
Спасибо, я возился с fileUpload последние пару часов, но когда я загружаю отдельные файлы, мне кажется, что я слишком сильно борюсь с системой. Я просто попробую это без ajaxForm, как я сказал выше, и просто с помощью jQuery. Я сообщу вам об этом. - person Ramon Tayag; 02.03.2011
comment
Как я уже писал, для загрузки файла с помощью ajax требуется специализированный инструмент. С простой формой не получится. - person apneadiving; 02.03.2011

Кажется, что независимо от того, используете ли вы .ajax или .ajaxForm для отправки, пока сервер отвечает, обратный вызов success будет выполняться.

Итак, я должен ответить специально структурированным json, который имеет success: true/false в зависимости от ситуации. Лучше всего это проиллюстрировано действием контроллера (здесь я использую inherited_resources, но вы поняли идею):

def create
  create! do |success, failure|
   success.html {redirect_to to}
   success.text do
     image = {
       :id => @image.id,
       :file_name => @image.file_name,
       :success => true
     }
     render :text => image.to_json
   end
   failure.text do
     image = {
      :success => false,
      :errors => @image.errors
     }
     render :text => image.to_json
   end
   success.js
  end
end
person Ramon Tayag    schedule 02.03.2011
comment
Кажется, что независимо от того, используете ли вы .ajax или .ajaxForm для его отправки, пока сервер отвечает, будет выполнен обратный вызов успеха. неправильно. Если сервер отвечает со статусом ошибки, обработчик ошибок будет запущен. - person Derek Litz; 28.03.2013