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