下面是一个简单的控制器更新操作:
def update
note = Note.find(params[:id])
if note.update(note_params)
render json: note.to_json
else
render json: {errors: note.errors}, status: :unprocessable_entity
end
end
字符串
这将以{"errors":{"title":["can't be blank"]}}
的形式呈现错误
但我希望它的形式是{"errors":{"title":["Title can't be blank"]}}
简单地使用{errors: note.errors.full_messages}
会得到{:errors=>["Title can't be blank"]}
,而忽略了属性键。
我能把它变成想要的形式的唯一方法似乎有点复杂:
full_messages_with_keys = note.errors.keys.inject({}) do |hash, key|
hash[key] = note.errors.full_messages_for(key)
hash
end
render json: {errors: full_messages_with_keys}, status: :unprocessable_entity
型
这是可行的,但我必须这样做似乎很奇怪,因为这似乎是在SPA前端进行验证的一个非常常见的用例。
2条答案
按热度按时间a0zr77ik1#
您可以使用
ActiveModel::Errors#group_by_attribute
来获取每个键的错误散列:字符串
接下来,只需从每个
ActiveModel::Error
示例生成完整的消息即可:型
是否有一个内置的方法/更规范的方式?
不完全是。一个框架不可能涵盖所有可能的需求。它提供了所需的工具来格式化错误。
然而,如果你想疯狂的话,这个功能可以被推到模型层、序列化器甚至是
ActiveModel::Errors
上的monopoly上,而不是在你的控制器上重复这个功能。型
xmd2e60i2#
您可以向
to_hash
或to_json
传递一个附加参数,以生成包含属性名称的消息:person.errors.to_hash(true)
个或
person.errors.to_json(full_messsages: true)
个都将返回
{"title":["Title can't be blank"]}