Search code examples
ruby-on-railsrubydry-rbdry-validation

How to validate date string with dry-validation gem?


I want to allow date formatted string with dry-validation gem, but I can't.

class NewUserContract < Dry::Validation::Contract
  params do
    optional(:date).filled(:date)
  end
end
contract = NewUserContract.new

contract.call(date: Date.today)
#=> #<Dry::Validation::Result{:date=>Tue, 14 Jan 2020} errors={}>

# I want to allow date formatted string
contract.call(date: '2020-01-20')
#=> #<Dry::Validation::Result{:date=>"2020-01-20"} errors={:date=>["must be a date"]}>

Date formatted string was allowed until 0.13, but it seems prohibited since 1.0. Now I'm trying to upgrade the dry-validation gem in my Rails app.

EDIT

I am not sure why, but the code above is working now. Maybe caching issue? (I remember I ran bin/rake tmp:cache:clear, though) Please ignore this question.


Solution

  • I checked with dry-validation 1.4.1, dry-schema 1.4.3 and dry-types 1.2.2 and this works just fine:

    require 'dry/validation'
    
    class NewUserContract < Dry::Validation::Contract
      params do
        optional(:date).filled(:date)
      end
    end
    contract = NewUserContract.new
    
    puts contract.call(date: Date.today).inspect
    # #<Dry::Validation::Result{:date=>#<Date: 2020-01-14 ((2458863j,0s,0n),+0s,2299161j)>} errors={}>
    
    puts contract.call(date: '2020-01-20').inspect
    # #<Dry::Validation::Result{:date=>#<Date: 2020-01-20 ((2458869j,0s,0n),+0s,2299161j)>} errors={}>