我对使用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
如果有人有解决方案吗?