2014-03-13 79 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