如何验证Grape API(Ruby)中参数的互斥性

如何验证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,

使用Grape定义API时,有一种非常方便的方法来验证参数的存在和类型,例如:

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块中的技巧,或者一种比手动检查和引发异常更方便的方法