Rails + ajaxForm:错误上传文件时使用'错误'回调

时间:2011-03-02 14:57:58

标签: ruby-on-rails ajaxform

背景

我首先想通过json上传文件并以这种方式获得回复。

我正在使用:

我很快发现you can't get a reponse in 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

现在,虽然当它失败时我可以在其中返回一个带有success: false的json对象,但只是感觉很脏,成功回调总是被执行。

如何使用错误回调?

2 个答案:

答案 0 :(得分:1)

以下是一些用于提交ajax的通用jQuery代码:

$('#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

  • with uploadify using flash
  • 使用jQuery Uploader,100%js(使用框架)

答案 1 :(得分:0)

看来你是否使用.ajax或.ajaxForm来提交它,只要服务器响应,就会执行success回调。

所以,我必须根据具体情况回复具有success: true/false的特殊结构的json。最好用控制器动作说明(我在这里使用的是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