如何在Rails中失败Ajax请求?

当用户单击特定项时,我使用jQuery的post方法更新数据库中的内容:

$.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

您可以在Rails中执行render :status => 400 (或其他一些错误代码),这将触发$.ajax()error回调,或者您可以使用错误消息呈现一些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处理程序的用途,应该以这种方式使用。

好吧,你必须添加一个error handling程序,并给它一个错误来处理。 所以,在你的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可能是或可能不是相应的错误代码 – 选择400和500之间的适当值。