2

背景

我首先想通过 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,但总是执行成功回调只是感觉很脏。

如何使用错误回调?

4

2 回答 2

1

下面是一些通用的 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(使用框架)
于 2011-03-02T15:20:00.057 回答
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
于 2011-03-02T19:17:09.487 回答