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

Rails中移除routes.rb通配路由后,如何正常处理404错误?

在Rails中无需通配路由处理404错误的方案

问题原因

Rails 7 对路由错误的处理逻辑做了调整:ActionController::RoutingError 不再抛至控制器层,而是由 ActionDispatch::ShowExceptions 中间件直接拦截处理,因此控制器中的 rescue_from 无法捕获该错误——这也是你移除通配路由后直接抛出错误的原因(Rails 6 中错误会抛到控制器层,所以原方案可行)。

解决方案

方案1:自定义中间件捕获路由错误

通过自定义中间件在错误到达默认处理逻辑前捕获并处理:

  1. 创建中间件文件 app/middleware/custom_routing_error_handler.rb:
class CustomRoutingErrorHandler
  def initialize(app)
    @app = app
  end

  def call(env)
    begin
      @app.call(env)
    rescue ActionController::RoutingError
      # 可根据需求调整响应格式(如JSON/HTML)
      [404, {'Content-Type' => 'text/plain'}, ['Not Found']]
    end
  end
end
  1. 在 config/application.rb 中注册中间件,确保它在 ActionDispatch::ShowExceptions 之前执行:
config.middleware.insert_before ActionDispatch::ShowExceptions, CustomRoutingErrorHandler

方案2:利用Rails动态错误页面机制(推荐)

借助Rails内置的异常转发功能,无需通配路由即可复用控制器中的处理逻辑:

  1. 在 config/application.rb 中开启异常路由转发:
config.exceptions_app = self.routes
  1. 在 config/routes.rb 中添加错误状态对应的路由:
get '/404', to: 'application#not_found'

此时,当发生404错误时,Rails会自动将请求转发到 /404 路由,触发 ApplicationController#not_found 方法,渲染你自定义的404内容。

补充:如果需要静态错误页面,直接在 public 目录下创建 404.html,Rails默认会优先使用该静态文件响应404错误,无需额外配置。

内容的提问来源于stack exchange,提问作者Иван Сизых

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:59:55