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

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はこの種の処理を許可していませんが、優れた代替手段があります。

ここに2つの例を示します(2つのブランチ):https ://github.com/apneadiving/Pic-upload --- Crop-in-Ajax

  • フラッシュを使用したuploadifyを使用
  • 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 に答える