Rails and respond_with: why are the status codes not right?

1.1k Views Asked by At

I'm trying to use bare bones rails controllers and have a more fine-grained control at the same time. If I'm on :new action, I respond_with my new @instance and I get a status code 200 and render the :new template. On show, same thing, different template. So far, so good. But, on the create, I'm having something unexpected. If the new record was successfully and I call respond_with on it, I am redirected to show (status code 302), which is right. But if the new record couldn't be created because the record wasn't valid, the default respond_with is responding by issuing status code 200 and rendering the new template. The template is right, the status code is not. Shouldn't the response code be in such a case 422 (unprocessable entity)?

1

There are 1 best solutions below

3
On

Rails returns a 200 response because it successfully rendered the 'new' template. For non-AJAX requests, this usually works fine, as you'll also display the validation errors to the user in that case so they know what happened.

The only reason you should need the 422 response is if the information was submitted via AJAX, and your client-side javascript is depending on the response code to know what to do. Like Jim said, you can always force the response code with the :status option to render if you need that. In the default 'simple' case though without AJAX involved, you probably don't need it.

Update: A jQuery client might depend on the response code by including an 'error' callback to the .ajax function, or via .ajaxError.