dry-validation
dry-validation copied to clipboard
Getting proc instead of string message
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
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.
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