使用Grape定义API时,可以非常方便地验证参数的存在和类型,例如:
params do
requires :param1, type: String
optional :param1, type: Integer
end
但是我看不到指定两个参数互斥的方便方法。 EG它会是这样的:
params do
requires :creatureName, type: String
requires
either :scaleType, type: String
or :furType, type: String
end
我对建议以最方便的方式来解决这个问题。
答案 0 :(得分:2)
参数可以定义为mutually_exclusive
,确保它们不会同时出现在请求中。
params do
optional :beer
optional :wine
mutually_exclusive :beer, :wine
end
警告:永远不要使用任何必需的参数定义互斥集。两个相互排斥的必需参数将意味着参数永远无效,从而使端点无用。与可选参数互斥的一个必需参数将意味着后者永远无效。
答案 1 :(得分:2)
您还可以使用exactly_one_of
:
params do
optional :scale_type
optional :fur_type
exactly_one_of :scale_type, :fur_type
end
at_least_one_of
,all_or_none_of
也可用。
关于它的更多信息here
答案 2 :(得分:1)
寻找同样的事情。你的问题让我打开引擎盖,看看是否可以完成。 Here's the pull request
答案 3 :(得分:0)
这种多参数限制难以融入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