ruby errors.add(:base,'foo')在Rails 7中不会中止保存

cvxl0en2  于 2023-04-20  发布在  Ruby
关注(0)|答案(1)|浏览(97)

this question之后,我确认在Rails 7中(与Rails 6不同)只有errors.add(:base, 'foo')errors.add(:base, :invalid, 'foo')有效地向模型对象添加了错误。根据官方文档[cap. 7.5]:
当你想说对象无效时,你可以向:base添加错误,不管它的属性值是什么。
我总是使用这个事实来 abortbefore_createbefore_save回调中将对象保存到数据库,并且它一直工作到Rails 7。
事实上,在Rails 7中,调用保存(例如@resource.save)会保存记录,即使它添加了errors[:base],根据旧版本Rails的行为和文档的常识,这不应该发生。
我还注意到,如果在before_validation回调函数中添加errors[:base],而不是在before_createbefore_save中添加,则模型对象被标记为无效(即未保存)。
有没有可能通过在before_validation之外的其他回调函数中添加errors[:base]来使模型对象 * 真正 * 无效(即使其 * 不 * 保存)?或者,新的Rails 7方法是否可以将事情更改为使用before_validation?或者,这是一个bug?

dvtswwa3

dvtswwa31#

您需要使用throw :abort,例如:

before_destroy do
  errors.add(:base, 'records cannot be destroyed')
  throw :abort
end

这在活动记录回调文档中的停止执行中进行了描述。

相关问题