dry-rb/dry-validation

Missing way to set rules for nested arrays easily

Ouverte

#745 ouverte le 10 déc. 2025

 (0 commentaire) (1 réaction) (0 personne assignée)Ruby (196 forks)github user discovery
bughelp wanted

Métriques du dépôt

Stars
 (1 422 étoiles)
Métriques de merge PR
 (Aucune PR mergée en 30 j)

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

Guide contributeur