如何验证Grape API(Ruby)中参数的互斥性
使用Grape定义API时,有一种非常方便的方法来验证参数的存在和类型,例如:如何验证Grape API(Ruby)中参数的互斥性,ruby,grape,grape-api,Ruby,Grape,Grape Api,使用Grape定义API时,有一种非常方便的方法来验证参数的存在和类型,例如: params do requires :param1, type: String optional :param1, type: Integer end 但是,我无法找到一种方便的方法来指定这两个参数是互斥的。比如说: params do requires :creatureName, type: String requires either :scaleType,
params do
requires :param1, type: String
optional :param1, type: Integer
end
但是,我无法找到一种方便的方法来指定这两个参数是互斥的。比如说:
params do
requires :creatureName, type: String
requires
either :scaleType, type: String
or :furType, type: String
end
我感兴趣的是关于解决这个问题最方便的方法的建议。这种多参数限制很难应用到DSL中。据我所知,解决方案是使两个参数都是可选的,并编写自己的代码来检查路由中是否调用了其中一个参数。它可能会引发与其他一致性验证相同的错误。如果这是项目中的常见模式,请编写一个帮助器
params do
requires :creature_name, type: String
optional :scale_type, type: String
optional :fur_type, type: String
end
post '/creatures/:creature_name' do
unless param[:scale_type] || param[:fur_type]
raise Grape::Exceptions::Validation, { param: "scale_type / fur_type",
message: "one of scale_type or fur_type must be provided" }
end
if param[:scale_type] && param[:fur_type]
raise Grape::Exceptions::Validation, { param: "scale_type / fur_type",
message: "only one of scale_type or fur_type can be provided" }
end
# ...
end
寻找同样的东西。你的问题让我打开引擎盖看看能不能做到 参数可以定义为相互排斥的
,,确保它们不会同时出现在请求中
params do
optional :beer
optional :wine
mutually_exclusive :beer, :wine
end
警告:切勿使用任何必需的参数定义互斥集。两个互斥的必需参数将意味着参数永远无效,从而使端点无效。一个必需参数与一个可选参数互斥将意味着后者永远无效。您也可以使用中的一个参数:
params do
optional :scale_type
optional :fur_type
exactly_one_of :scale_type, :fur_type
end
至少有一个
,全部或无
也可用。
更多信息谢谢尼尔,我也依靠自己开支票。我将继续讨论这个问题,看看是否有人知道任何可以将其全部保存在params块中的技巧,或者一种比手动检查和引发异常更方便的方法