Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
HTTP status code symbols for Rails
HTTP status code symbols for Rails
Thanks to Cody Fauser for this list of HTTP responce codes and their Ruby on Rails symbol mappings.
Status Code Symbol
1xx Informational
100 :continue
101 :switching_protocols
102 :processing
2xx Success
200 :ok
201 :created
202 :accepted
203 :non_authoritative_information
204 :no_content
205 :reset_content
206 :partial_content
207 :multi_status
226 :im_used
3xx Redirection
300 :multiple_choices
301 :moved_permanently
302 :found
303 :see_other
304 :not_modified
305 :use_proxy
307 :temporary_redirect
4xx Client Error
400 :bad_request
401 :unauthorized
402 :payment_required
403 :forbidden
404 :not_found
405 :method_not_allowed
406 :not_acceptable
407 :proxy_authentication_required
408 :request_timeout
409 :conflict
410 :gone
411 :length_required
412 :precondition_failed
413 :request_entity_too_large
414 :request_uri_too_long
415 :unsupported_media_type
416 :requested_range_not_satisfiable
417 :expectation_failed
422 :unprocessable_entity
423 :locked
424 :failed_dependency
426 :upgrade_required
5xx Server Error
500 :internal_server_error
501 :not_implemented
502 :bad_gateway
503 :service_unavailable
504 :gateway_timeout
505 :http_version_not_supported
507 :insufficient_storage
510 :not_extended
Copy link

g8d3 commented Aug 4, 2016

Is not there a map inside Rails?

Copy link

g8d3 commented Aug 4, 2016

Found Rack::Utils::HTTP_STATUS_CODES.

Copy link

AlexVPopov commented Aug 5, 2016

@juanpastas In Rack::Utils you also have SYMBOL_TO_STATUS_CODE,which matches the symbol names to the numeric values.

Copy link

cesc1989 commented Sep 15, 2016

Cool. Never used them because didn't take the time to find the list. Gonna fork this. Thanks a lot.

Copy link

richpeck commented Aug 24, 2017

Copy link

artur-intech commented Aug 3, 2019

No 3rd party code needed:

require 'net/http'

p Net::HTTPResponse::CODE_TO_OBJ

=> {"100"=>Net::HTTPContinue, "101"=>Net::HTTPSwitchProtocol, "200"=>Net::HTTPOK, "201"=>Net::HTTPCreated, "202"=>Net::HTTPAccepted, "203"=>Net::HTTPNonAuthoritativeInformation, "204"=>Net::HTTPNoContent, "205"=>Net::HTTPResetContent, "206"=>Net::HTTPPartialContent, "207"=>Net::HTTPMultiStatus, "226"=>Net::HTTPIMUsed, "300"=>Net::HTTPMultipleChoices, "301"=>Net::HTTPMovedPermanently, "302"=>Net::HTTPFound, "303"=>Net::HTTPSeeOther, "304"=>Net::HTTPNotModified, "305"=>Net::HTTPUseProxy, "307"=>Net::HTTPTemporaryRedirect, "308"=>Net::HTTPPermanentRedirect, "400"=>Net::HTTPBadRequest, "401"=>Net::HTTPUnauthorized, "402"=>Net::HTTPPaymentRequired, "403"=>Net::HTTPForbidden, "404"=>Net::HTTPNotFound, "405"=>Net::HTTPMethodNotAllowed, "406"=>Net::HTTPNotAcceptable, "407"=>Net::HTTPProxyAuthenticationRequired, "408"=>Net::HTTPRequestTimeOut, "409"=>Net::HTTPConflict, "410"=>Net::HTTPGone, "411"=>Net::HTTPLengthRequired, "412"=>Net::HTTPPreconditionFailed, "413"=>Net::HTTPRequestEntityTooLarge, "414"=>Net::HTTPRequestURITooLong, "415"=>Net::HTTPUnsupportedMediaType, "416"=>Net::HTTPRequestedRangeNotSatisfiable, "417"=>Net::HTTPExpectationFailed, "422"=>Net::HTTPUnprocessableEntity, "423"=>Net::HTTPLocked, "424"=>Net::HTTPFailedDependency, "426"=>Net::HTTPUpgradeRequired, "428"=>Net::HTTPPreconditionRequired, "429"=>Net::HTTPTooManyRequests, "431"=>Net::HTTPRequestHeaderFieldsTooLarge, "500"=>Net::HTTPInternalServerError, "501"=>Net::HTTPNotImplemented, "502"=>Net::HTTPBadGateway, "503"=>Net::HTTPServiceUnavailable, "504"=>Net::HTTPGatewayTimeOut, "505"=>Net::HTTPVersionNotSupported, "507"=>Net::HTTPInsufficientStorage, "511"=>Net::HTTPNetworkAuthenticationRequired}

Copy link

elissonmichael commented Oct 22, 2019

Thanks for sharing this.

Copy link

tvillafane commented Dec 7, 2019

(Rails 5.1.4) 416 is wrong. :requested_range_not_satisfiable -> :range_not_satisfiable corrects it.

Copy link

EthanML commented Jan 10, 2020

413 is also wrong now - it should be: :payload_too_large.

Copy link

artemgurzhii commented Feb 17, 2020

429: Too Many Requests

Copy link

khiav223577 commented Apr 18, 2020

@juanpastas In Rack::Utils you also have SYMBOL_TO_STATUS_CODE,which matches the symbol names to the numeric values.

@AlexVPopov Thanks for sharing :)
I spent lots of time googling for it.

Copy link

danielricecodes commented May 11, 2020

This really ought to be in the official Rails Guides.

Copy link

liondancer commented May 14, 2020

Copy link

piharpi commented Jul 9, 2020

@liondancer 👀️ yeah,,, we must put it here

Copy link

piharpi commented Jul 9, 2020

Copy link

reginadiana commented Aug 13, 2020

OMGGG thanks

Copy link

aesyondu commented Aug 24, 2020

Documentation for generic status types are so hard to find.

Just leaving this here for future reference:

In rspec:
generic status type (:success, :missing, :redirect, or :error)

Copy link

alexsmartens commented Feb 5, 2021

is it possible to include a custom error message statusText with the response?

Copy link

Arsen7 commented Feb 17, 2021

@alexsmartens : It looks like no, it's not. Or at least it's not easy.

A few days ago I was trying to achieve exactly that. I had a nice idea, that you could pass a string for example in render plain: "BOO", status: '543 Server out of sugar' as the status, and then it would return exactly that to the end user.

(I wanted the status text to be dynamic, so that each render might set it differently - for example providing translated statuses, in line with what all the relevant RFCs say. Merely adding another entry to the Rack::Utils::HTTP_STATUS_CODES was not good enough for me. But even that would not work.)

With these changes to the status_code method in lib/rack/utils.rb in the rack gem:

--- lib/rack/utils.rb-old
+++ lib/rack/utils.rb
@@ -578,9 +578,13 @@
       [message.downcase.gsub(/\s|-|'/, '_').to_sym, code]
+    STATUS_STRING_REGEXP = /\A([1-5][0-9][0-9]) (.+)\z/
     def status_code(status)
       if status.is_a?(Symbol)
         SYMBOL_TO_STATUS_CODE.fetch(status) { raise ArgumentError, "Unrecognized status code #{status.inspect}" }
+      elsif status.is_a?(String) && status =~ STATUS_STRING_REGEXP
+        status

plus some changes to action_dispatch/http/response.rb (from the ActionPack gem) and rack/response.rb (from the Rack gem) so that they would not call to_i on the status values in various stages, and so that they would read the "message" from that string-type status, some form of MVP was working. Maybe I needed also some more tiny changes, but I do not remember it now.

But then I got into Puma, where the status was again converted to integer, and the status text was being taken again from a hardcoded list of texts (same form as in rack/utils, but it's a separate code). At that point I gave up.

The coding itself looks trivial. The real problem lies in testing for backwards compatibility, and - this is the most terrifying part! - talking to various groups of people to accept these changes into their projects. 😱

If you feel brave enough, you may try to work on that.

Copy link

Zlatov commented Aug 6, 2021

Missing an important one :

I support your remark!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment