遵循Rails教程编写代码执行validates校验触发报错,应如何修复?
报错产生原因
最核心的触发点是Element模型中inclusion校验的语法错误:原代码中inclusion: { :in ['paragraph','image','video-embed']} 不符合Ruby Hash的键值对书写规范,:in作为Hash的键,缺失了和值(允许值数组)的关联符号,Ruby无法正常解析该段代码,直接触发运行报错。
如果修正语法后仍有报错,大概率是Rails 5+版本的默认规则导致:该版本起belongs_to关联默认要求关联对象必须存在,如果@post是未持久化到数据库的新记录,构建关联元素时会触发关联必填校验报错。
对应解决方法
- 优先修正校验规则的语法错误,两种合法写法二选一即可:
# Ruby 1.9+ 推荐的符号键简写 validates :element_type, inclusion: { in: ['paragraph','image','video-embed'] } # 兼容旧版本Ruby的写法 validates :element_type, inclusion: { :in => ['paragraph','image','video-embed'] }
- 若修正语法后出现关联必填报错,可以根据业务需求二选一处理:
- 确保调用
@post.elements.build前@post已经调用save方法持久化到数据库 - 在关联声明中添加可选配置,关闭
belongs_to的默认必填校验:
belongs_to :post, optional: true - 确保调用
- 如果业务场景允许
element_type为空,可以在校验规则中添加allow_nil或allow_blank配置,避免无值时触发校验失败:
validates :element_type, inclusion: { in: ['paragraph','image','video-embed'] }, allow_nil: true
内容的提问来源于stack exchange,提问作者Allan Solitei
相关产品推荐
相关产品推荐

