Grape:数组中每个元素的自定义验证器

时间:2017-05-23 14:30:19

标签: ruby validation grape grape-api

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

我的参数如下所示:

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

使用requires :conditions, type: Array, valid_conditions: true,验证器将针对整个阵列运行。我能得到的最好吗?

2 个答案:

答案 0 :(得分: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 >

答案 1 :(得分: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