Optional Keys and Values

We make a clear distinction between specifying an optional key and an optional value. This gives you a way of being very specific about validation rules. You can define a schema which can give you precise errors when a key was missing or key was present but the value was nil.

This also comes with the benefit of being explicit about the type expectation. In the example below we explicitly state that :age can be omitted or if present it must be an integer and it must be greater than 18.

You can define which keys are optional and define rules for their values:

require 'dry-validation'

schema = Dry::Validation.Schema do
  required(:email).filled

  optional(:age).filled(:int?, gt?: 18)
end

errors = schema.call(email: 'jane@doe.org').messages

puts errors.inspect
# {}

errors = schema.call(email: 'jane@doe.org', age: 17).messages

puts errors.inspect
# { :age => ["must be greater than 18"] }

Optional Values

When it is valid for a given value to be nil you can use maybe macro:

require 'dry-validation'

schema = Dry::Validation.Schema do
  required(:email).filled

  optional(:age).maybe(:int?, gt?: 18)
end

schema = Schema.new

errors = schema.call(email: 'jane@doe.org', age: nil).messages

puts errors.inspect
# {}

errors = schema.call(email: 'jane@doe.org', age: 19).messages

puts errors.inspect
# {}

errors = schema.call(email: 'jane@doe.org', age: 17).messages

puts errors.inspect
# { :age => ["must be greater than 18"] }