Rails 7仅API模式下无法捕获ActionController::RoutingError问题
Rails 7 API模式下自定义路由错误404响应的解决方案
问题原因
ActionController::RoutingError是在路由匹配阶段抛出的,此时请求还未进入任何控制器(包括你的BaseController),所以BaseController里的rescue_from配置根本不会触发,这就是自定义响应不生效的核心原因。
方案一:API命名空间兜底路由(推荐)
直接在API路由的末尾添加兜底规则,捕获所有未匹配的请求:
# config/routes.rb Rails.application.routes.draw do namespace :api do namespace :v1 do # 你的其他API路由(比如resources :mandates) resources :mandates # 兜底路由,必须放在所有API路由的最后 match '*unmatched_path', to: 'base#render_not_found_error', via: :all end end end
这样所有以api/v1/开头但未匹配到具体路由的请求,都会被转到BaseController的render_not_found_error方法,你之前写的自定义响应逻辑就能正常执行了。
方案二:全局异常处理应用(适用于统一管理所有异常)
如果需要统一处理全局所有异常(不止路由错误),可以配置exceptions_app:
- 创建异常处理控制器
# app/controllers/api/v1/exceptions_controller.rb module Api module V1 class ExceptionsController < ActionController::API def handle_404 render json: { error: true, message: "路由不存在: #{request.path}" }, status: :not_found end end end end
- 配置异常应用
在config/application.rb或对应环境配置文件(如config/environments/development.rb)中添加:
config.exceptions_app = ->(env) { Api::V1::ExceptionsController.action(:handle_404).call(env) }
- 开发环境额外配置
开发环境下需要关闭本地错误页面显示,否则Rails会优先自带错误页面:
# config/environments/development.rb config.consider_all_requests_local = false
方案选择建议
- 仅需处理API路由错误:选方案一,配置简单且只影响API命名空间内的请求。
- 需要统一管理所有异常响应:选方案二,可扩展处理500等其他错误场景。
内容的提问来源于stack exchange,提问作者mr_muscle
相关产品推荐
相关产品推荐

