You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 创建异常处理控制器
# 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
  1. 配置异常应用
    在config/application.rb或对应环境配置文件(如config/environments/development.rb)中添加:
config.exceptions_app = ->(env) { Api::V1::ExceptionsController.action(:handle_404).call(env) }
  1. 开发环境额外配置
    开发环境下需要关闭本地错误页面显示,否则Rails会优先自带错误页面:
# config/environments/development.rb
config.consider_all_requests_local = false

方案选择建议

  • 仅需处理API路由错误:选方案一,配置简单且只影响API命名空间内的请求。
  • 需要统一管理所有异常响应:选方案二,可扩展处理500等其他错误场景。

内容的提问来源于stack exchange,提问作者mr_muscle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:05:38