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

Rails生产环境启动报错:未初始化常量Openai::Openai

解决Rails 8.0.1生产环境启动时OpenAI类命名空间错误

问题原因

Rails 8默认使用Zeitwerk作为自动加载器,它严格遵循文件结构与常量名的映射规则:

  • 蛇形命名的目录对应驼峰命名的模块(如openai/目录对应Openai模块)
  • 蛇形命名的文件对应驼峰命名的常量(如openai.rb文件对应Openai类)

你的app/services/openai/openai.rb文件被Zeitwerk识别为应定义Openai::Openai常量,但你实际在文件中定义了顶级的OpenAI类,同时手动通过require_relative引入,两者冲突导致报错。

解决方案

方案一:遵循Zeitwerk命名约定(推荐)

根据需求二选一:

  • 若要将类放入命名空间:修改openai.rb中的类定义,使其归属Openai模块:

    module Openai
      class OpenAI
        # 你的类逻辑代码
      end
    end
    

    之后在代码中通过Openai::OpenAI调用该类,并移除application_controller.rb中的require_relative语句(Zeitwerk会自动加载)。

  • 若要保持顶级OpenAI类:将app/services/openai/openai.rb移动到app/services/openai.rb,直接让文件对应顶级常量。同样移除require_relative语句,Zeitwerk会自动处理加载。

方案二:禁用Zeitwerk对目标目录的自动加载

如果需要保留现有文件结构和顶级类定义,可在config/application.rb中配置Zeitwerk忽略该目录:

config.autoloader = :zeitwerk
config.autoload_paths -= %W[#{config.root}/app/services/openai]

配置后,Zeitwerk不会处理app/services/openai/目录,你可以继续通过require_relative加载顶级OpenAI类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:55:00