【Rails】APIモードで使えるHTTPステータスコードのシンボルまとめ

## はじめに
Railsで使える**HTTPステータスコードのシンボル**の一覧です。
**Rails APIモード**で使えるのではないかと思います。

## 環境
```yaml
OS: macOS Catalina 10.15.3
Ruby: 2.6.5
Rails: 6.0.2.1
```

## きっかけ
JSONを返すAPIのコントローラーでは、以下のような一文をよく見かけます。

```ruby:users_controller.rb
render json: user, status: ：ok # この:okのこと
```
これは、下記のようにも書けます。

```ruby:users_controller.rb
render json: user, status: 200
```
この方が簡潔に書けるし、「はいはい、`200`は`OK`だよね！」と分かるかと思います。

でも、これならどうでしょうか？

```ruby:sample.rb
status: 429
```
シンボルで書くと、こうなります。

```ruby:sample.rb
status: :too_many_requests
```
**「リクエスト多すぎ！」**ってことですね。
１時間あたりに〇〇回しかリクエスト投げられないAPIを使っていて、リクエストを投げすぎたときに返ってきます。

### 結論：`200` or `:ok` どちらを使うべきか

- チーム開発を経た経験から、**開発者のスキルが全員同じは絶対にない**
- HTTPステータスコードより英語の方がわかりやすい

という点から、`:ok`の方が全体に対するメリットが多いのではないかと思います。

とはいえ、**「覚えられないのでリファレンス欲しい**と思いましたので今回まとめました！

## HTTPステータスコードのシンボル一覧
```ruby:シンボル一覧.rb
100 :continue
101 :switching_protocols
102 :processing
103 :early_hints
200 :ok
201 :created
202 :accepted
203 :non_authoritative_information
204 :no_content
205 :reset_content
206 :partial_content
207 :multi_status
208 :already_reported
226 :im_used
300 :multiple_choices
301 :moved_permanently
302 :found
303 :see_other
304 :not_modified
305 :use_proxy
306 :unused
307 :temporary_redirect
308 :permanent_redirect
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 :payload_too_large
414 :uri_too_long
415 :unsupported_media_type
416 :range_not_satisfiable
417 :expectation_failed
421 :misdirected_request
422 :unprocessable_entity
423 :locked
424 :failed_dependency
425 :too_early
426 :upgrade_required
428 :precondition_required
429 :too_many_requests
431 :request_header_fields_too_large
451 :unavailablefor_legal_reasons
500 :internal_server_error
501 :not_implemented
502 :bad_gateway
503 :service_unavailable
504 :gateway_timeout
505 :http_version_not_supported
506 :variant_also_negotiates
507 :insufficient_storage
508 :loop_detected
509 :bandwidth_limit_exceeded
510 :not_extended
511 :network_authentication_required
```

## 対応するヘルパーメソッド

```ruby:ヘルパー一覧.rb
def invalid?;             status < 100 || status >= 600;        end

def informational?;       status >= 100 && status < 200;        end
def successful?;          status >= 200 && status < 300;        end
def redirection?;         status >= 300 && status < 400;        end
def client_error?;        status >= 400 && status < 500;        end
def server_error?;        status >= 500 && status < 600;        end

def ok?;                  status == 200;                        end
def created?;             status == 201;                        end
def accepted?;            status == 202;                        end
def no_content?;          status == 204;                        end
def moved_permanently?;   status == 301;                        end
def bad_request?;         status == 400;                        end
def unauthorized?;        status == 401;                        end
def forbidden?;           status == 403;                        end
def not_found?;           status == 404;                        end
def method_not_allowed?;  status == 405;                        end
def precondition_failed?; status == 412;                        end
def unprocessable?;       status == 422;                        end

def redirect?;            [301, 302, 303, 307, 308].include? status; end
```

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [rack/utils.rb at 838ce3aee47456573675ba2353f1573158caab32 · rack/rack · GitHub](https://github.com/rack/rack/blob/838ce3aee47456573675ba2353f1573158caab32/lib/rack/utils.rb#L504)
- [rack/response.rb at 4a6c17913fc0da3aec896d1a8912dd8a501c32d0 · rack/rack · GitHub](https://github.com/rack/rack/blob/4a6c17913fc0da3aec896d1a8912dd8a501c32d0/lib/rack/response.rb#L134)