2014-03-13 43 views
2

当定义使用葡萄的API,有验证的存在和参数类型,例如一个非常方便的方法:如何验证则params的互斥性葡萄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

这种多参数限制很难放入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 
+0

谢谢尼尔,我也依靠写我自己的支票。我将继续讨论这个问题,看看是否有人知道任何可以保留在params块中的技巧,或者比手动检查和引发异常更方便 –

2

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

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

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

1

您还可以使用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