Rails + ajaxForm: используйте callback-функцию error при загрузке файла - PullRequest
2 голосов
/ 02 марта 2011

Фон

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

Я использую:

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

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

Проблема

Теперь моя проблема обработка ошибок .

Вот 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, когда он выходит из строя, он просто чувствует себя грязным, потому что обратный вызов успеха всегда выполняется.

Как использовать функцию обратного вызова с ошибкой?

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Вот некоторый общий код 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 (с использованием фреймов)
0 голосов
/ 02 марта 2011

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

Итак, я должен ответить с помощью специально структурированного jsonкоторый имеет success: true/false в зависимости от ситуации.Лучше всего это проиллюстрировать с помощью действия контроллера (я использую здесь Legited_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
...