2017-05-23 90 views
1

是否可以针对Grape中的每个数组元素运行自定义验证器?我知道我可以用我的验证器验证整个数组,但我认为如果我为每个元素使用它,错误消息会更好。Grape:数组中每个元素的自定义验证器

我的参数是这样的:

"conditions": [ 
     { 
      "field": "interests", 
      "operator": "any", 
      "value": ['cars', 'cats'] 
     }, 
     { 
      "field": "age", 
      "operator": "gt", 
      "value": 25 
     } 
    ] 

随着requires :conditions, type: Array, valid_conditions: true验证运行整个阵列。我能得到最好的结果吗?

回答

0

这是完全可能的,您可以在响应中声明特定键的值。

assert_equal some_obj[0].first[1], "interests" 

这里是IRB

Success weeds out the uncommitted ~ irb 
2.2.3 :001 > a = [{:field=>"interests", :operator=>"any", :value=>["cars", "cats"]}] 
=> [{:field=>"interests", :operator=>"any", :value=>["cars", "cats"]}] 
2.2.3 :002 > a[0].first 
=> [:field, "interests"] 
2.2.3 :003 > a[0].first[1] 
=> "interests" 
2.2.3 :004 > 
0

是有可能同样的事情,但你必须使用一个自定义的验证。

下面是一个例子

class Validator < Grape::Validations::Base 
    def validate_param!(attr_name, params) 
    unless params[attr_name].each { //your code here } 
     fail Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: 'your message' 
    end 
    end 
end 

你会再使用这样的:

requires :conditions, type: Array, validator: true