Techioz Blog

Rails にカスタム HTTP ステータス コード シンボルを追加する

概要

背景: 一般に、応答で返される HTTP ステータス コードを手動で指定したい場合、Rails は、それらの数値を明示的に使用するのではなく、使用する事前定義された人間が判読可能な Ruby シンボルの適切なセットを提供します。コード。

たとえば、次のようなことができます。

render text: "hurray!", status: :ok

もちろん、これは最終的にはこれと同じです。

render text: "hurray!", status: 200

私の状況では、カスタム HTTP ステータス コード (数字 242 を任意に選択しました) をレンダリングしたいと思います。明らかに、このコードは標準ではなく、Rails 内にシンボリック表現がないため、実際の数値を使用する必要があります。

現在の解決策: コード内で比較的人間が読みやすいようにするために、次のように定数を定数ファイルの 1 つに配置しました。

初期化子/定数.rb

NEEDS_UPDATE_CODE = 242

そして、私のコントローラーでは次のようにレンダリングします。

render text: "whatever I want to render", status: NEEDS_UPDATE_CODE

質問: これは明らかに問題なく動作しますが、カスタム HTTP ステータス コードの新しいシンボリック表現を Rails に追加する方法はあるのでしょうか?

解決策

質問を書いているときに答えを見つけました。現在SOで重複が見つからないため、他の誰かが同じ質問をした場合に備えてこの回答を投稿します。

シンボル表現と HTTP ステータス コードのマッピングの初期セットは、Rack::Utils モジュールの SYMBOL_TO_STATUS_CODE というアクセス可能なハッシュにあります。さらに、人間が判読できるステータス コード マッピングは HTTP_STATUS_CODES にあります。

コードでシンボリック表現を使用するために、これをイニシャライザに追加しました。

Rack::Utils::SYMBOL_TO_STATUS_CODE[:application_needs_update] = 242

これにより、そのシンボルを次のように使用できるようになります。

render text: "whatever I want to render", status: :application_needs_update

残念ながら、rails ログには次のようなステータス コードのみが表示されます。

これは、私のカスタム コードに慣れていない人にとってはあまり役に立ちません。これを修正するには、これを同じファイルに追加します。

Rack::Utils::HTTP_STATUS_CODES[242] = "Application Needs Update"

その結果、このコードを使用してリクエストが完了すると、ログには次のように表示されます。