Params
Probably the most common use case is to validate HTTP params. This is a special kind of a validation for a couple of reasons:
- The input is a hash with stringified keys
- The input can include values that are strings, hashes or arrays
- Prior to validation, we need to symbolize keys and coerce values based on the information in a schema
For that reason, dry-schema
ships with Params
schemas:
schema = Dry::Schema.Params do
required(:email).filled(:string)
required(:age).filled(:integer, gt?: 18)
end
errors = schema.call('email' => '', 'age' => '18').errors
puts errors.to_h.inspect
# {
# :email => ["must be filled"],
# :age => ["must be greater than 18"]
# }
Params-specific value coercion is handled by the hash type from
dry-types
. It is built automatically for you based on the type specs and used prior to applying the validation rules
Handling empty strings
Your schema will automatically coerce empty strings to nil
, provided that you allow a value to be nil:
schema = Dry::Schema.Params do
required(:email).filled(:string)
required(:age).maybe(:integer)
required(:tags).maybe(:array)
end
result = schema.call('email' => 'jane@doe.org', 'age' => '', 'tags' => '')
puts result.to_h
# {:email=>'jane@doe.org', :age=>nil, :tags=>nil}
Your schema will automatically coerce empty strings to an empty array:
schema = Dry::Schema.Params do
required(:tags).value(:array)
end
result = schema.call('tags' => '')
puts result.to_h
# {:email=>'jane@doe.org', :age=>nil, :tags=>[]}