Eric
Eric

Reputation: 6475

How can I use a custom predicate to validate multiple fields with dry-validation?

I have an address form that I want to validate as a whole rather than validating each input on its own. I can only tell if the address is valid by passing the line1, city, state, zip to the custom predicate method so that it can check them as a unit.

How can I do this? I only see how to validate individual fields.

Upvotes: 4

Views: 2081

Answers (2)

Eric Duminil
Eric Duminil

Reputation: 54303

It seems that this "High-level Rules" example could help you :

schema = Dry::Validation.Schema do
  required(:barcode).maybe(:str?)

  required(:job_number).maybe(:int?)

  required(:sample_number).maybe(:int?)

  rule(barcode_only: [:barcode, :job_number, :sample_number]) do |barcode, job_num, sample_num|
    barcode.filled? > (job_num.none? & sample_num.none?)
  end
end

barcode_only checks 3 attributes at a time.

So your code could be :

  rule(valid_address: [:line1, :city, :state, :zip]) do |line, city, state, zip|
    # some boolean logic based on line, city, state and zip
  end

Upvotes: 3

akuhn
akuhn

Reputation: 27813

Update—this is for ActiveRecords rather than dry-validation gem.

See this tutorial, http://guides.rubyonrails.org/active_record_validations.html

Quoting from the tutorial,

You can also create methods that verify the state of your models and add messages to the errors collection when they are invalid. You must then register these methods by using the validate (API) class method, passing in the symbols for the validation methods' names.

class Invoice < ApplicationRecord
  validate :discount_cannot_be_greater_than_total_value

  def discount_cannot_be_greater_than_total_value
    if discount > total_value
      errors.add(:discount, "can't be greater than total value")
    end
  end
end

Upvotes: 0

Related Questions