如何在Rails中失败Ajax请求?

Mis*_*hko 12 ajax jquery ruby-on-rails jquery-post ruby-on-rails-3

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

$.post("/posts/" + post_id + "/update_something", 
       { some_param: some_value }, 
       success_handler);
Run Code Online (Sandbox Code Playgroud)

这里update_something看起来是这样的:

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

问题是如果update_attributes失败,请求仍然成功并success_handler执行.

如果update_attributes失败,我怎么能导致请求失败,以至于success_handler不会被执行?

Cal*_*vin 28

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

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

然后在你的success_handler函数中你会:

function success_handler (response) {
    if (response.success) {
        // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

哦,update_attributes失败时返回false.因此,您可以基于此呈现您的回复.

2年后编辑:

几年后看到这有几个upvotes,我强烈建议使用该status: 400方法而不是渲染200.它是errorAJAX请求中的处理程序的用途,应该以这种方式使用.


Jor*_*ing 6

好吧,你必须添加一个错误处理程序,并给它一个错误来处理。所以,在你的 JavaScript 中:

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

在 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
Run Code Online (Sandbox Code Playgroud)

注意:这里 500可能是也可能不是合适的错误代码——在400s 和 500s中选择合适的那个。