Rails中如何获取所有嵌套记录对应的验证错误消息
解决方案
方案1:开启Rails原生嵌套错误索引(适用Rails 6.1及以上版本)
Rails从6.1版本开始原生支持为嵌套属性错误添加索引标识,只需要做全局配置即可:
在config/application.rb中添加如下配置:
config.active_record.index_nested_attribute_errors = true
开启配置后,你执行创建操作返回的错误会自动携带对应子记录的索引,格式如下:
@errors=[#<ActiveModel::NestedError attribute=bars[0].title, type=blank, options={}>, #<ActiveModel::NestedError attribute=bars[2].title, type=blank, options={}>]
直接通过属性名即可识别出是索引0和2的Bar记录验证失败。
方案2:手动遍历子记录校验结果(兼容所有Rails版本)
如果使用的Rails版本低于6.1,可以直接遍历父对象关联的子记录,逐个校验错误并匹配索引:
# 先实例化对象而非直接create,方便后续获取关联记录 foo = Foo.new(bars_attributes: [{ title: nil }, { title: "foo" }, { title: nil }]) if foo.save # 保存成功的业务逻辑 else # 遍历所有bar,筛选出验证失败的记录和对应索引 failed_bars = foo.bars.each_with_index.with_object([]) do |(bar, index), result| next if bar.errors.empty? result << { index: index, record: bar, errors: bar.errors.full_messages } end # 此处failed_bars已经包含所有验证失败的Bar的索引、原对象和错误信息 end
这种方式不仅能拿到失败记录的索引,还可以直接操作对应失败的Bar实例,灵活度更高。
内容的提问来源于stack exchange,提问作者Slevin
相关产品推荐
相关产品推荐

