如何在Grape API(Ruby)中验证params的互斥性

时间:2014-03-13 05:07:48

标签: ruby grape grape-api

使用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 个答案:

答案 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_ofall_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