dry-validation icon indicating copy to clipboard operation
dry-validation copied to clipboard

Getting proc instead of string message

Open sekrett opened this issue 1 year ago • 2 comments

Describe the bug

I am getting a callable proc in the following code.

To Reproduce

require 'dry-validation'

class TestContract < Dry::Validation::Contract
  params do
    required(:last_name).filled(:string)
    optional(:birthday).maybe(:date)
  end
  
  rule(:birthday) do
    key.failure('wrong date')
  end

  rule(:last_name) do
    result.errors.to_h
  end
end

validator = TestContract.new
puts validator.call(last_name: 'Last', birthday: '5.01.0202').errors.to_h

# {:birthday=>[#<Proc:0x0000000128fc0ed0 /Users/sekrett/.local/share/mise/installs/ruby/3.3.0/lib/ruby/gems/3.3.0/gems/dry-validation-1.10.0/lib/dry/validation/messages/resolver.rb:36 (lambda)>]}

Expected behavior

# {:birthday=>["wrong date"]}

My environment

  • Affects my production application: NO
  • Ruby version: 3.3.0
  • OS: macOS 13.6.7

Workaround

Make a copy of errors:

result.errors.dup.to_h

sekrett avatar Jul 10 '24 09:07 sekrett

The API documentation indicates that Dry::Validation::Evaluator#result is private.

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

This suggests that modifying the result instance during evaluation might not be a supported use case.

eriklovmo avatar Dec 25 '24 22:12 eriklovmo

I see this issue is quite old, @sekrett do you mind still sharing what your intention is/was to use result within the rule block? Tia 🙏

  rule(:last_name) do
    result.errors.to_h
  end

unused avatar Jun 27 '25 19:06 unused