When user clicks a specific item, I use jQuery's post method to update something in the database:
$.post("/posts/" + post_id + "/update_something",
{ some_param: some_value },
success_handler);
where update_something
looks like this:
def update_something
post = Post.find(params[:id])
post.update_attributes(:some_field => params[:some_param])
render :nothing => true
end
The problem is if update_attributes
fails, the request still succeeds and success_handler
is executed.
How could I cause the request to fail when update_attributes
fails such that success_handler
won't be executed?
You can either do render :status => 400
(or some other error code) in Rails, which will trigger the error
callback of $.ajax()
, or you can render some JSON with an error message:
render :json => { :success => false }
Then in your success_handler
function you would:
function success_handler (response) {
if (response.success) {
// do stuff
}
}
Edit:
Oh, and update_attributes
returns false when it fails. So you can render your response based on that.
Edit 2 years later:
After a couple years and seeing that this has a few upvotes, I'd highly recommend using the status: 400
method instead of rendering 200
. It's what the error
handler in AJAX requests are for, and should be used that way.
Well, you have to add an error handler, and give it an error to handle. So, in your JavaScript:
$.post( "/posts/" + post_id + "/update_something",
{ some_param : some_value }
)
.done( successHandler )
.fail( errorHandler ) // define errorHandler somewhere, obviously
;
And in 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
Note: 500
may or may not be the appropriate error code here—choose whichever among the 400s and 500s is appropriate.