私は、自分自身で各入力を検証するのではなく、全体として検証したいアドレス形式を持っています。私はアドレスが有効であるかどうかは、line1、city、state、zipをカスタム述語メソッドに渡して、ユニットとしてそれらをチェックできるようにすることによってのみ伝えることができます。カスタム検証を使用して、複数のフィールドを検証するにはどうすればよいですか?
どうすればいいですか?私は個々のフィールドを検証する方法しか見ていない。
私は、自分自身で各入力を検証するのではなく、全体として検証したいアドレス形式を持っています。私はアドレスが有効であるかどうかは、line1、city、state、zipをカスタム述語メソッドに渡して、ユニットとしてそれらをチェックできるようにすることによってのみ伝えることができます。カスタム検証を使用して、複数のフィールドを検証するにはどうすればよいですか?
どうすればいいですか?私は個々のフィールドを検証する方法しか見ていない。
アップデート - これは、gemではなくActiveRecord用です。
このチュートリアルを参照してください
、チュートリアルから引用 http://guides.rubyonrails.org/active_record_validations.html、
また、あなたのモデルの状態を確認し、それらが無効であるときのエラーコレクションにメッセージを追加するメソッドを作成することができます。これらのメソッドは、
validate
(API)クラスメソッドを使用して登録し、検証メソッドの名前のシンボルを渡す必要があります。
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
this "High-level Rules" exampleはあなたを助けることができると思わ:
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
チェック時には3つの属性。
だからあなたのコードは次のようになります。
rule(valid_address: [:line1, :city, :state, :zip]) do |line, city, state, zip|
# some boolean logic based on line, city, state and zip
end
残念ながらあなたはActiveRecordのバリデーションをここで参照しているが、これではありませんので、私が代わりにhttps://github.com/dry-rb/dry-validationを使用しています解決策。 – Eric
ああああ、残念だよ! – akuhn