2012-02-16 69 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