Rails 6嵌套控制器POST请求出现“无法自动加载常量”错误
问题场景
在Rails 6开发应用时,向嵌套控制器发送POST请求遇到异常:
当向localhost:3000/api/aspr/assessment_projects提交参数{"title":"test"}时,Rails抛出错误:
Unable to autoload constant Assessment, expected /home/wm/app_name/app/models/aspr/assessment.rb to define it.
对应的模型文件app/models/aspr/assessment.rb确实存在,且所有控制器的GET请求均正常,仅POST请求触发该错误。
目录结构
控制器路径:
app/controllers/api/aspr/assessments_controller.rb
模型路径:
app/models/aspr/assessment.rb
解决方案
检查模型命名空间定义
确保aspr/assessment.rb中的模型正确使用命名空间,代码需符合以下格式:module Aspr class Assessment < ApplicationRecord # 模型业务逻辑 end endRails自动加载对大小写敏感,文件夹名
aspr(小写)对应模块名Aspr(首字母大写),必须严格匹配。修正控制器中的模型引用
检查assessments_controller.rb的POST请求处理代码,确保正确使用命名空间引用模型,避免直接写Assessment:module Api module Aspr class AssessmentsController < ApplicationController def create # 错误写法:@assessment = Assessment.new(assessment_params) # 正确写法: @assessment = Aspr::Assessment.new(assessment_params) # ... 保存逻辑 end private def assessment_params params.require(:assessment).permit(:title) end end end endGET请求正常可能是因为查询逻辑中用了正确的命名空间,而POST的create方法遗漏了命名空间声明。
清除缓存并重启服务器
Rails 6的自动加载机制可能存在缓存残留,执行以下命令清除临时文件:rails tmp:clear重启Rails服务器,确保新的命名空间配置生效。
验证关联模型的命名空间配置
如果AssessmentProject模型关联了Assessment,需在关联声明中指定完整类名:class AssessmentProject < ApplicationRecord belongs_to :assessment, class_name: 'Aspr::Assessment' end避免因关联加载时找不到正确命名空间的模型而触发错误。
兜底检查自动加载路径
默认情况下Rails会自动加载app/models下的所有子目录,若有自定义配置,需确保config/application.rb中包含对应路径:config.autoload_paths += Dir[Rails.root.join('app', 'models', '**/')]
内容的提问来源于stack exchange,提问作者Pardeep Saini

