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

Rails自定义中间件在GitHub CI中未被识别的问题

问题排查:CI环境下Rails自定义中间件常量未初始化错误

问题原因

  • 命名空间不匹配:app/middleware/error_handler.rb中的类未包裹在Middleware模块中,但application.rb里却用Middleware::ErrorHandler引用,导致常量查找失败。本地环境因Spring预加载或自动加载缓存掩盖了问题,CI全新环境直接暴露错误。
  • 自动加载路径限制:Rails默认不会自动加载app/middleware目录,本地开发时的临时加载机制在CI中不生效,加上类名与引用不匹配,最终触发NameError。

解决办法

方案1:修正命名空间匹配

确保中间件类嵌套在Middleware模块中,与application.rb的引用一致:

# app/middleware/error_handler.rb
module Middleware
  class ErrorHandler
    def initialize(app)
      @app = app
    end

    def call(env)
      # 你的错误处理逻辑
      @app.call(env)
    rescue StandardError => e
      # 自定义错误响应逻辑
    end
  end
end

此方案无需修改application.rb中的配置,保持原有的config.middleware.use Middleware::ErrorHandler即可。

方案2:移除命名空间引用

如果不需要Middleware命名空间,直接使用顶级类:

  1. 修改application.rb中的中间件引用:
# config/application.rb
require_relative "../app/middleware/error_handler"

module AppName
  class Application < Rails::Application
    # ...
    config.middleware.use ErrorHandler
    # ...
  end
end
  1. 调整error_handler.rb的类定义:
# app/middleware/error_handler.rb
class ErrorHandler
  def initialize(app)
    @app = app
  end

  def call(env)
    # 错误处理逻辑
    @app.call(env)
  end
end

方案3:添加middleware到自动加载路径(可选)

若希望Rails自动加载app/middleware目录,在application.rb中添加路径配置,同时保证类名与引用一致:

# config/application.rb
module AppName
  class Application < Rails::Application
    # ...
    config.autoload_paths << Rails.root.join('app', 'middleware')
    config.middleware.use Middleware::ErrorHandler # 或ErrorHandler,根据类定义调整
    # ...
  end
end

注:此方式不推荐,middleware手动require更清晰,避免自动加载带来的潜在问题。

额外优化(非错误原因,但可提升CI效率)

CI步骤中db:migrate与db:schema:load重复,建议只保留db:schema:load:

run: |
  bin/rails db:create db:schema:load
  bundle exec rspec

内容的提问来源于stack exchange,提问作者Int'l Man Of Coding Mystery

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:35:15