Rails 6出现UnknownAttribute错误 如何让模型识别对应属性?
Rails 6
ActiveModel::UnknownAttributeError 相关问题解答 1. 「只能通过迁移为模型分配属性」的说法正误
该说法不完全正确。
- Rails Active Record 模型默认会自动同步对应数据表的 schema 信息,迁移文件中定义的列会被自动绑定为模型的属性,无需额外声明。
- 但并非只有迁移可以给模型添加属性,你可以通过以下两种常用方式添加无数据库对应列的属性,无需新增迁移:
- 使用
ActiveModel::AttributesAPI 声明虚拟属性:class Product < ApplicationRecord # 无需数据库对应列,即可直接使用该属性做赋值、校验等操作 attribute :temp_tag, :string end - 使用
store/store_accessor声明序列化扩展属性:class Product < ApplicationRecord # 仅需数据库存在`extra`这个text/json类型列,即可绑定多个子属性 store :extra, accessors: [:weight_unit, :warranty_period], coder: JSON end
- 使用
2. ActiveModel::UnknownAttributeError 的触发原因
你提到的「视图表单提交了未在模型中定义的属性」是该错误最常见的触发场景,当你对模型实例执行批量赋值操作(比如Model.new(params)、@model.update(params))时,传入的参数键不在模型的属性列表中就会抛出该错误。
除此之外还有以下常见触发场景:
- 新增列的迁移执行后未重启Rails服务,框架未加载到最新的schema信息,识别不到新增属性
- 属性名拼写错误,比如数据库列名为
mobile,赋值时误写为moblie - 对纯Active Model类(无对应数据表)赋值了未提前用
attribute声明的属性
内容的提问来源于stack exchange,提问作者von spotz
相关产品推荐
相关产品推荐

