在 Rails API 服务中访问未定义的路由时呈现 JSON 格式的响应

render JSON formatted response when accessing undefined routes in Rails API service

情况如下:

如果用户尝试使用未定义的路由访问我的 rails-api 服务,rails 将捕获异常并使用 [=15] 呈现 html =] 到浏览器。

但我希望我的 rails-api 服务执行的是它可以捕获任何类似这样的错误和 return 请求的 json-formatted 错误信息来源,如下所示:

# if i visit a route which is undefined in my config/routes.rb like this:

HTTP.get('http://localhost:3000/api/v1/route/of/undefined')

# what i want it to render to the page is:

{status: 404, err_msg: 'route of undefined, please check again.'}

在我采取行动之前,我发现 Rails 将请求与路由匹配发生在它初始化控制器之前,因此如果我将 rescue_from 添加到我的 ApplicationController,ApplicationController没有机会挽救异常。

此外,我在我的项目中添加了以下行:

# config/application.rb
config.exceptions_app = self.routes

# config/environments/development.rb
config.consider_all_requests_local = false

接下来我该做什么?我搜索了很多但找不到解决这个问题的答案。尤其是 rails api service.

如果你想为所有未定义的路由呈现相同的响应,你可以像下面那样做,

match '*path', to: "error_controller#handle_root_not_found", via: [:get, :post]

在 route.rb 末尾添加此行。 之后生成 error_controller 并在那里定义 handle_root_not_found 方法,这将呈现您的自定义响应。

def handle_root_not_found
   render json: { message: "route not found"}, status: 404
end

所以在这种情况下会发生什么是当你请求一个特定的路由时,它会从上到下扫描路由文件。 如果找到该路线,那么它会将您重定向到该路线。 如果在 match '*path' 行之前找不到路由,则此行会将其重定向到 handle_root_not_found 方法,该方法将呈现我们的自定义响应。