gpt4 book ai didi

ruby-on-rails - 将嵌套模型的验证错误返回为 Rails 中的 json 的更好方法?

转载 作者:行者123 更新时间:2023-12-01 04:57:07 25 4
gpt4 key购买 nike

我有类(class)顺序,可以包含条目。每个条目可以是复杂类型,并由另一个条目组成。

class Order < ActiveRecord::Base
accepts_nested_attributes_for :entries
end

class Entry < ActiveRecord::Base
accepts_nested_attributes_for :members, allow_destroy: true
end

在表单中,我在表单中使用了 rails 生成的字段,使用 fields_for
<input autocomplete="off" class="string required form-control" id="order_entries_attributes_1459329286687_members_attributes_1459329286739_title" name="order[entries_attributes][1459329286687][members_attributes][1459329286739][title]" placeholder="Наименование" type="text">

所以,我提交了一个订单形式,例如有 2 个条目,5 个成员有一些验证错误(2 个成员没有标题),然后它传递给 Controller
class OrdersController
def update
if @order.update(order_params)
render json: @order
else
render json: @order.errors, status: :unprocessable_entity
end
end
end

它返回给我这个
{"entries.members.title":["cant be blank"]}

问题是我无法找到其中的哪个条目和哪个成员,有一个验证错误,这就是为什么我不能例如突出显示这个字段。此外,它合并了类似的错误。这是问题。

在提交时,我传递了唯一索引(在名称属性中),并且 rails 正确使用它来创建嵌套模型,如果错误响应包含此索引,那就太好了。

有没有其他方法可以从服务器返回很好的索引错误,并使用 rails 作为 json 的 api 而不痛苦?

最佳答案

更新为与 Rails 嵌套参数格式相同

render json: {
order: {
entries: @order.entries.enum_for(:each_with_index).collect{|entry, index|
{
index => {
id: entry.id,
errors: entry.errors.to_hash,
members: entry.members.enum_for(:each_with_index).collect{|member, index|
{
index => {
id: member.id,
errors: member.errors.to_hash
}
} unless member.valid?
}.compact
}
} unless entry.valid?
}.compact
}
}

你应该得到一个 JSON 响应,如:
{
order: {
entries: [
0: {
id: 1, # nil, if new record
errors: {},
members: [
0: {
id: 7, # nil, if new record
errors: {
title: ["cant be blank"]
}
},
1: {
id: 13, # nil, if new record
errors: {
title: ["cant be blank"]
}
}
]
}
]
}
}

附言也许其他人知道这样做的一种与 rails 集成的方式。否则,我会说这可能是 git 中 Rails 的一个很好的功能请求。

关于ruby-on-rails - 将嵌套模型的验证错误返回为 Rails 中的 json 的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36325540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com