13

当用户单击特定项目时,我使用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_attributessuccess_handler不会被执行?

4

2 回答 2

28

您可以render :status => 400在 Rails 中执行(或其他一些错误代码),这将触发 的error回调$.ajax(),或者您可以呈现一些带有错误消息的 JSON:

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

然后在您的success_handler功能中,您将:

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

编辑:

哦,update_attributes失败时返回 false。因此,您可以基于此呈现您的响应。

2年后编辑:

几年后,看到这有一些赞成票,我强烈建议使用该status: 400方法而不是render 200。这就是errorAJAX 请求中的处理程序的用途,并且应该以这种方式使用。

于 2012-02-16T05:18:22.867 回答
6

好吧,你必须添加一个错误处理程序,并给它一个错误来处理。因此,在您的 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中选择一个合适的。

于 2012-02-16T05:20:13.237 回答