gpt4 book ai didi

ruby - 如何验证这个散列参数?

转载 作者:数据小太阳 更新时间:2023-10-29 07:39:16 24 4
gpt4 key购买 nike

如何为这个散列参数编写正确的 params 验证:

{
"files": {
"main.c": {
"contents": "#include <stdio.h> ...",
"foo": "bar"
},
"main.h": {
"contents": "#define BLAH ...",
"foo": "baz"
},
... more files here ...
}
}

files 是我要验证的散列参数。 files 的每个键可以是任何东西(字符串);这些值是具有特定格式的散列,也需要验证(需要 contentsfoo)。我正在使用葡萄 0.9.0。

这就是我想要的:

params do
optional :files, type: Hash do
requires <any key>, type: Hash do
requires :contents, type: String
requires :foo, type: String
end
end
end

我读过 documentation但我看不出如何实现这种验证。有可能吗?我需要编写自定义验证程序吗?


另一种方法是用这个代替:

{
"files":
[
{
"name": "main.c",
"contents": "#include <stdio.h> ...",
"foo": "bar"
},
{
"name": "main.h",
"contents": "#define BLAH ...",
"foo": "baz"
}
]
}

可以像这样轻松验证:

params do
optional :files, type: Array do
requires :name, type: String
requires :contents, type: String
requires :foo, type: String
end
end

但现在我失去了拥有唯一文件名的能力。

最佳答案

基于grape documentation我会想出编写您自己的自定义验证器的想法,然后使用您的第二个备选方案。

class UniqueHashAttributes < Grape::Validations::Base
def validate_param!(attr_name, params)
# assuming @option is an array
@option.each do |attribute|
# detects if the value of the attribute is found more than once
if params[attr_name].group_by { |h| h[attribute] }.values.collect(&:size).max > 1
fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)],
message: "must have only unique values for properties: '#{@option.join(', ')}'"
end
end
end
end

还可以报告出现唯一性违规的自定义错误。当然,这个原则也可以应用于执行与唯一性不同的验证。

如果此验证器已加载到您的应用程序中,您可以在路由的 params 定义中使用它,如下所示:

params do
optional :files, unique_hash_attributes: [:name], type: Array do
requires :name, type: String
requires :contents, type: String
requires :foo, type: String
end
end
post '/validation' do
'passed'
end

通过此实现,您还可以通过将 :foo 字段(或任何其他字段)添加到唯一哈希属性数组来指定它是唯一的。

哈希值(名称、内容、foo)的任何验证在 files 验证器中保持不变,并且仍然适用。

带有以下数据的post请求不会通过验证:

{   "files":
[
{
"name": "main.c",
"contents": "#include <stdio.h> ...",
"foo": "bar"
},
{
"name": "main.c",
"contents": "#define BLAH ...",
"foo": "baz"
}
]
}

关于ruby - 如何验证这个散列参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27728326/

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