Grape - 不要在可选参数上应用验证器

时间:2017-06-12 09:14:51

标签: ruby grape-api

我对使用Grape gem编写的API存在问题。我写了custom validator来检查发送到我的API的UUID是否符合预期的格式。

对于可选字段,用户可以1.不发送值,或2.发送空值。

在第二种情况下,我的UUID验证器被评估并检查nil值,该值失败(它应该成功,因为这是一个可选的参数)。如果选中的参数是可选必需,我需要签入验证程序,并且仅当参数是可选的时才允许nil值。你知道怎么办?

到目前为止,我唯一的选择是为每个UUID(不安全)允许nil值或匹配模式,或者定义两个不同的验证器。

module PublicApi
  module Validators
    # This class represents a UUID params and validates the UUID format
    # Valid for both nil values and uuid-formatted strings (8-4-4-4-12)-
    #
    # Usage in the endpoint:
    #   requires :id, type: String, uuid: true
    #
    class Uuid < Grape::Validations::Base
      def validate_param!( attr_name, params )
        # TODO: accept nil value only if the param is optional
        uuid_param = params[ attr_name ]
        unless uuid_param.nil? || uuid_param =~ /^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$/i
          fail Grape::Exceptions::Validation, params: [ @scope.full_name( attr_name ) ],
                                              message: "must be a UUID, in this format: '58d5e212-165b-4ca0-909b-c86b9cee0111'"
        end
      end
    end
  end
end

如果有人有解决方案吗?

0 个答案:

没有答案