dry-rb/dry-validation

Missing way to set rules for nested arrays easily

Open

#745 opened on Dec 10, 2025

View on GitHub
 (0 comments) (1 reaction) (0 assignees)Ruby (193 forks)github user discovery
bughelp wanted

Repository metrics

Stars
 (1,421 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

Describe the bug

I'd like to validate something with structure like:

{
  foos: [
    {
      bars: [
        {some_entry: 1},
        {some_entry: 2}
      ]
    }
  ]
}

As far as I can tell, there's no good way to do that. I can't nest rules. There's a way to validate the nested entries with key paths, like in here: https://github.com/dry-rb/dry-validation/issues/732#issuecomment-1770474838 But this is getting really messy. At that point the rule is not really for :foos either - it's for something much deeper.

Expected behavior

I'd really like to either stack contracts, so that the rules can be attached there, like:

  class FooContract < Dry::Validation::Contract
    params do
      required(:bars).hash(BarContract)
    end
    rule(:some_entry) ...
  end

  class MainContract < Dry::Validation::Contract
    params do
      required(:foos).array { hash(FooContract) }
    end
  end

Or the ability to stack rules, so:

  class MainContract < Dry::Validation::Contract
    params do
      required(:foos).array { hash(FooParams) }
    end
    rule(:foos).each do |foo|
      rule(foos: foo).each do |bar|
        key(....)....
      end
    end
  end

My environment

  • Affects my production application: No

Contributor guide