在 Rails 中添加自定义 HTTP 状态代码符号

问题描述 投票:0回答:1

背景:通常,在我们想要手动指定响应中返回的HTTP状态代码的情况下,Rails为我们提供了一组很好的预定义的人类可读的Ruby符号来使用,而不是显式地使用这些代码的数值。

我们可以做如下的事情,例如:

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

这当然最终与此相同:

render text: "hurray!", status: 200

在我的情况下,我想呈现一个自定义的 HTTP 状态代码(我任意选择了数字 242)。显然,这段代码不是标准的,并且在 Rails 中没有符号表示,所以我必须使用实际的数值。

当前解决方案:为了使其在代码中保持相对可读性,我在常量文件之一中放置了一个常量,如下所示:

初始化器/常量.rb

NEEDS_UPDATE_CODE = 242

在我的控制器中,我像这样渲染:

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

问题:这显然工作得很好,但它让我想知道,有没有办法向 Rails 添加自定义 HTTP 状态代码的新符号表示?

ruby-on-rails ruby ruby-on-rails-4 http-status-codes
1个回答
13
投票

我在写问题的时候找到了答案。由于我目前在 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 日志只会显示状态代码,例如:

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

这对于不熟悉我的自定义代码的人来说并不是很有帮助。为了纠正这个问题,我可以将其添加到同一文件中:

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

因此,当使用此代码完成请求时,我的日志将显示以下内容:

在 363 毫秒内完成 242 个应用程序需要更新(查看次数:8.6 毫秒 | ActiveRecord:12.0 毫秒)

© www.soinside.com 2019 - 2024. All rights reserved.