Ruby on Rails中uninitialized constant Degree错误排查求助
解决
uninitialized constant Degree错误的方案 你遇到的这个问题其实是Rails的一个常见“坑”——type是ActiveRecord的保留字段,它专门用来实现「单表继承(STI)」功能。当你给Education模型的type字段存入Degree时,Rails会默认认为你要加载一个名为Degree的子类(继承自Education),但你根本没定义这个类,所以就触发了uninitialized constant Degree的错误。
而且从终端日志能看到,数据其实已经成功保存了(最后有COMMIT记录),报错是发生在重定向后加载/profile页面时:当set_user方法加载@user.education时,Rails尝试把这条记录实例化为Degree类,这时候才抛出错误。
下面给你两种可行的解决办法,推荐第一种:
方案1:重命名type字段(推荐)
既然你不需要用STI,直接把字段名改成非保留字就可以彻底解决问题:
步骤1:生成迁移文件重命名字段
在终端运行:
rails generate migration RenameTypeToEducationTypeInEducations
步骤2:编辑迁移文件
打开生成的迁移文件,修改成如下内容(注意迁移版本要和你的Rails版本匹配):
class RenameTypeToEducationTypeInEducations < ActiveRecord::Migration[5.2] def change rename_column :educations, :type, :education_type end end
步骤3:执行迁移
rails db:migrate
步骤4:修改控制器的参数白名单
在ProfileController的user_params方法里,把type改成education_type:
def user_params params.require(:user).permit(:name, education_attributes: %i[id education_type name issue_institute education_status]) end
步骤5:修改视图的表单字段
把视图里的select字段名从:type改成:education_type:
<%= e.select :education_type, options_for_select(%w(Degree Certification), params[:education_type]), prompt: 'Degree/Certification', class: 'form-control m-input' %>
方案2:保留type字段但关闭STI功能
如果你确实不想改字段名,可以在Education模型里告诉Rails不要把type当作STI字段:
打开app/models/education.rb,添加一行代码:
class Education < ApplicationRecord belongs_to :user validates_presence_of :user_id # 关闭STI,指定一个不存在的字段作为继承列 self.inheritance_column = :_unused_type end
这样Rails就不会再尝试加载Degree类,你的type字段就可以正常存字符串值了。
内容的提问来源于stack exchange,提问作者Harini
相关产品推荐
相关产品推荐

