2016-12-28 4 views
4

私は、自分自身で各入力を検証するのではなく、全体として検証したいアドレス形式を持っています。私はアドレスが有効であるかどうかは、line1、city、state、zipをカスタム述語メソッドに渡して、ユニットとしてそれらをチェックできるようにすることによってのみ伝えることができます。カスタム検証を使用して、複数のフィールドを検証するにはどうすればよいですか?

どうすればいいですか?私は個々のフィールドを検証する方法しか見ていない。

答えて

1

アップデート - これは、​​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 
+0

残念ながらあなたはActiveRecordのバリデーションをここで参照しているが、これではありませんので、私が代わりにhttps://github.com/dry-rb/dry-validationを使用しています解決策。 – Eric

+0

ああああ、残念だよ! – akuhn

1

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 
関連する問題