gpt4 book ai didi

ruby-on-rails - Rails 中需要返回 JSON 格式的 404 错误

转载 作者:行者123 更新时间:2023-12-03 05:18:22 25 4
gpt4 key购买 nike

我的 Rails 应用程序中有一个普通的 HTML 前端和一个 JSON API。现在,如果有人调用 /api/not_existent_method.json 它会返回默认的 HTML 404 页面。有没有办法将其更改为类似 {"error": "not_found"} 的内容,同时保持 HTML 前端的原始 404 页面完好无损?

最佳答案

一位 friend 向我推荐了一个优雅的解决方案,它不仅可以处理 404 错误,还可以处理 500 错误。事实上,它处理每个错误。关键是,每个错误都会生成一个异常,该异常会通过机架中间件堆栈向上传播,直到由其中一个中间件处理为止。如果您有兴趣了解更多,可以观看this excellent screencast 。 Rails 有自己的异常处理程序,但您可以通过文档较少的 exceptions_app 配置选项来覆盖它们。现在,您可以编写自己的中间件,也可以将错误路由回 Rails,如下所示:

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

然后您只需在 config/routes.rb 中匹配这些路由即可:

get "/404" => "errors#not_found"
get "/500" => "errors#exception"

然后你只需创建一个 Controller 来处理这个问题。

class ErrorsController < ActionController::Base
def not_found
if env["REQUEST_PATH"] =~ /^\/api/
render :json => {:error => "not-found"}.to_json, :status => 404
else
render :text => "404 Not found", :status => 404 # You can render your own template here
end
end

def exception
if env["REQUEST_PATH"] =~ /^\/api/
render :json => {:error => "internal-server-error"}.to_json, :status => 500
else
render :text => "500 Internal Server Error", :status => 500 # You can render your own template here
end
end
end

最后要补充的一点是:在开发环境中,rails 通常不会渲染 404 或 500 页面,而是打印回溯。如果您想在开发模式下查看 ErrorsController 的运行情况,请在 config/enviroments/development.rb 文件中禁用回溯功能。

config.consider_all_requests_local = false

关于ruby-on-rails - Rails 中需要返回 JSON 格式的 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10253366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com