Rails 5.0.5+Devise 4.3.0添加type属性后创建用户报NameError错误
这个问题我太熟了!Rails里的type字段是个自带特殊属性的角色——它默认是**单表继承(Single Table Inheritance, STI)**的标识字段。你现在遇到的报错,根源就在这里:
当你给User模型添加type字段后,Rails自动开启了STI模式。它看到提交的User.type = 'hunter',就会试图去加载名为Hunter的常量(也就是继承自User的子类),但你根本没定义这个类,所以直接抛出了NameError - wrong constant name hunter。
下面给你两种针对性的解决方案,看你的实际需求选:
方案一:你只是想存普通类型字符串,不需要STI
如果你的type字段只是用来标记用户的类型(比如猎人、普通用户这类分类),完全不需要用到Rails的继承逻辑,那直接在User模型里禁用STI的自动检测就行:
# app/models/user.rb class User < ApplicationRecord # 把STI的继承列指定为一个不存在的字段,让Rails忽略type字段的特殊作用 self.inheritance_column = :_unused_type # 保留你原有的Devise配置和其他代码 devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end
改完之后记得重启服务器,再提交表单就不会触发STI的常量查找了,type字段就只是个普通的字符串字段用。
方案二:你确实需要用到STI(不同类型用户有专属逻辑)
如果你的设计是要让不同type的用户对应不同的业务逻辑,那你需要创建对应的子类模型:
- 在
app/models目录下创建hunter.rb文件:
# app/models/hunter.rb class Hunter < User # 这里可以写Hunter专属的方法、验证、关联等逻辑 end
- 如果之后还有其他
type值(比如collector),也要对应创建Collector < User的模型文件。
这样Rails在创建用户时,看到type='hunter'就会找到对应的Hunter类,不会再报错了。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

