I’m using dry-validations 0.13.3 with Ruby 2.6.2. I’d like to convert a string passed in from our frontend into an array of hashes:
schema = Dry::Validation.Schema do
required(:sorts).each do
schema do
required(:name).value(included_in?: %i[a b])
required(:dir).value(included_in?: %i[asc desc])
end
end
end
puts schema.call(sorts: 'a:asc,b:desc').inspect
This yields the error:
#<Dry::Validation::Result output={:sorts=>"a:asc,b:desc"} errors={:sorts=>["must be an array"]}>
Following the instructions about input preprocessing, I tried creating a custom type:
SortString =
Dry::Types::Definition
.new(Array)
.constructor do |input|
input.split(',').map do |s|
name, dir = s.split(':', 2)
{ name: name.to_sym, dir: dir.to_sym }
end
end
puts SortString['a:asc,b:desc']
This appears to work:
{:name=>:a, :dir=>:asc}
{:name=>:b, :dir=>:desc}
But using it in the validation has the same error:
schema = Dry::Validation.Schema do
configure { config.type_specs = true }
required(:sorts, SortString).each do
schema do
required(:name).value(included_in?: %i[a b])
required(:dir).value(included_in?: %i[asc desc])
end
end
end
puts schema.call(sorts: 'a:asc,b:desc').inspect
#<Dry::Validation::Result output={:sorts=>"a:asc,b:desc"} errors={:sorts=>["must be an array"]}>