2

使用 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

我对解决此问题的最便捷方法的建议感兴趣。

4

4 回答 4

3

您还可以使用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也可以。更多关于它在这里

于 2017-03-03T11:31:14.450 回答
2

参数可以定义为mutually_exclusive,确保它们不会同时出现在请求中。

params do
  optional :beer
  optional :wine
  mutually_exclusive :beer, :wine
end

警告:切勿使用任何必需的参数定义互斥集。两个互斥的必需参数将意味着参数永远无效,从而使端点无用。一个必需参数与一个可选参数互斥将意味着后者永远无效。

于 2014-06-05T17:23:59.677 回答
1

寻找同样的东西。你的问题让我打开了引擎盖,看看是否可以完成。这是拉取请求

于 2014-04-11T16:58:16.583 回答
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
于 2014-03-13T08:21:14.860 回答