【问题标题】:Rails + ajaxForm: Use the 'error' callback when error uploading fileRails + ajaxForm:上传文件出错时使用“错误”回调
【发布时间】:2011-03-02 14:57:58
【问题描述】:

背景

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

如何使用错误回调?

【问题讨论】:

  • 你不应该依赖插件来提交表单,如果它会导致太多的约束。有几行js要做:防止默认提交,用post进行ajax调用。从那里您可以处理任何您希望的情况

标签: ruby-on-rails ajaxform


【解决方案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(使用框架)

【讨论】:

  • 谢谢,在过去的几个小时里,我一直在修改 fileUpload,但是当我上传单个文件时,我似乎与系统对抗太多了。如上所述,我将在没有 ajaxForm 的情况下尝试这个,而只是“通用 jQuery”方式。我会通知你的。
  • 正如我所写,使用 ajax 上传文件需要定制工具。它不适用于简单的表单。
【解决方案2】:

看来不管是用.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

【讨论】:

  • "好像不管是用.ajax还是.ajaxForm提交,只要服务器响应,就会执行成功回调。" 错误。如果服务器以错误状态响应,则错误处理程序运行。
猜你喜欢
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
相关资源
最近更新 更多