dry-rb/dry-validation

Missing way to set rules for nested arrays easily

開放

#745 建立於 2025年12月10日

 (0 則留言) (1 個反應) (0 位負責人)Ruby (195 個分叉)github user discovery
bughelp wanted

倉庫指標

星標
 (1,422 顆星)
PR 合併指標
 (30 天內沒有已合併 PR)

描述

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

貢獻者指南