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