2012-02-16 108 views
11

當用戶點擊一個特定的項目,我用jQuery's post method更新數據庫中的東西:如何在Rails中失敗Ajax請求?

$.post("/posts/" + post_id + "/update_something", 
     { some_param: some_value }, 
     success_handler); 

其中update_something看起來是這樣的:

def update_something 
    post = Post.find(params[:id]) 
    post.update_attributes(:some_field => params[:some_param]) 
    render :nothing => true 
end 

的問題是,如果update_attributes失敗,請求仍然成功並執行success_handler

如果update_attributes失敗導致success_handler不會執行,我怎麼會導致請求失敗?

回答

26

您可以做的Rails render :status => 400(或其他一些錯誤代碼),這將觸發error回調$.ajax(),也可以使一些JSON一條錯誤消息:

render :json => { :success => false }

然後在您success_handler功能您可以:

function success_handler (response) { 
    if (response.success) { 
     // do stuff 
    } 
} 

編輯:

噢,update_attributes失敗時返回false。所以你可以基於此來呈現你的迴應。

編輯2年後:

之後幾年,看到這有幾個upvotes,我會強烈建議使用status: 400方法,而不是渲染200。這是AJAX請求中的error處理程序的用途,應該這樣使用。

4

那麼,你必須添加一個錯誤處理程序,並給它一個錯誤來處理。所以,在你的JavaScript:

$.post("/posts/" + post_id + "/update_something", 
     { some_param : some_value } 
    ) 
    .done(successHandler) 
    .fail(errorHandler)  // define errorHandler somewhere, obviously 
; 

而且在Rails的:

def update_something 
    post = Post.find params[ :id ] 

    success = post.update_attributes :some_field => params[ :some_param ] 

    head success ? :ok : :internal_server_error 
end 

注:500可能會或可能不會進行相應的錯誤代碼在這裏,選擇400s and 500s中適當的指令。

+0

謝謝!我不熟悉jQuery的「成功」和「錯誤」方法。試圖尋找文檔,但沒有成功。你能提供一個指針嗎? – 2012-02-16 05:28:36

+1

+1您也可以返回成功/失敗標題。你在Rails中的最後一行看起來像是「頭部成功」? :ok::internal_server_error',其中'head:ok'將返回狀態200,'head:internal_server_error'將返回狀態500. – Substantial 2012-02-16 05:31:14

+0

Misha:'post','get'和'ajax'返回一個jqXHR對象,它是(很差)[記錄在這裏](http://api.jquery.com/jQuery.ajax/#jqXHR)。仔細閱讀,我發現'error'和'success'已被棄用,現在你應該使用[Deferred](http://api.jquery.com/category/deferred-object/)的'done'和'fail' 。我已經更新了我的代碼以反映這一點,並且合併了@ gg_s的建議,這是一個很好的提示。 – 2012-02-16 05:38:23