Pregunta Agregar símbolos de código de estado HTTP personalizados


Fondo: Generalmente, en situaciones donde queremos especificar manualmente el código de estado HTTP que se devolverá en la respuesta, Rails nos da un bonito conjunto de símbolos de Ruby legibles por humanos predefinidos  usar, en lugar de usar explícitamente los valores numéricos para esos códigos.

Podemos hacer algo como lo siguiente, por ejemplo:

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

Que es, por supuesto, lo mismo que esto:

render text: "hurray!", status: 200

En mi situación, me gustaría presentar un código de estado HTTP personalizado (he elegido arbitrariamente el número 242). Obviamente, este código no es estándar y no tiene una representación simbólica dentro de Rails, así que tengo que usar el valor numérico real.

Solución actual: Para mantenerlo en un código relativamente legible para los humanos, he colocado una constante en uno de mis archivos constantes, como por ejemplo:

inicializadores / constantes.rb

NEEDS_UPDATE_CODE = 242

Y en mi mando, me rindo así:

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

Pregunta: Obviamente, esto funciona bien, pero me pregunto si hay una manera de agregar una nueva representación simbólica para un código de estado HTTP personalizado a Rails.


5
2018-03-20 17:40


origen


Respuestas:


Encontré la respuesta mientras escribía la pregunta. Como no puedo encontrar duplicados actualmente en SO, publicaré esta respuesta en caso de que alguien más tenga la misma pregunta.

El conjunto inicial de representaciones de símbolos-mapeos de códigos de estado HTTP se encuentra en Rack :: Utils módulo, en un hash accesible llamado SYMBOL_TO_STATUS_CODE. Además, las asignaciones de código de estado legibles por humanos se encuentran en HTTP_STATUS_CODES.

Para usar la representación simbólica en mi código, simplemente agregué esto en mi inicializador:

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

Lo que me permite usar ese símbolo así:

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

Desafortunadamente, el registro de rieles solo mostrará el código de estado, por ejemplo:

Completed 242 in 363ms (Views: 8.6ms | ActiveRecord: 12.0ms)

Lo cual no es terriblemente útil para alguien que no está familiarizado con mi código personalizado. Para rectificar eso, puedo agregar esto en el mismo archivo:

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

Como resultado, cuando se completa una solicitud utilizando este código, mi registro mostrará esto:

La aplicación 242 completada necesita una actualización en 363ms (Vistas: 8.6ms | ActiveRecord: 12.0ms)


8
2018-03-20 17:40