2017-10-24 20 views
0

私が持っているこのような単純なApplicationRecordクラス:Railsは - 別のフィールドが空でない場合は、フィールドを検証

class User < ApplicationRecord 
    validates :name, presence: true 
    validates :surname, presence: true 
end 

私はフィールドがそれらのいずれかがある場合にのみ存在している必要がありますように私のコードを変更したいのですがプレゼント。それは標準で働くように不正な形式の場合には、私は、具体的なフィールドに関連付けられている私のカスタム検証メッセージを表示したいので、私は、標準のRailsのフォームを使用

if name_is_present? || surname_is_present? 
    validate_name 
    validate_surname 
else 
    #don't validate anything 
end 

:だから、私のようなものを持っている必要があります検証。これどうやってするの?

+1

両方の存在または両方が存在しないことを検証する 'ActiveModel :: Validator'を作成することができます。 –

+0

@AlejandroMontillaは実際には、通常の存在確認のための 'if:'と 'unless:'オプションに多くのロジックを押し込むよりもはるかに良いアイデアです。 http://guides.rubyonrails.org/active_record_validations.html#performing-custom-validations – max

答えて

2

を使用する必要があります。

バリデーターは実際には単純です。モデル上で述語を実行し、満たされていない場合はモデルのエラーオブジェクトにエラーメッセージを追加します。

class User < ApplicationRecord 
    validate :name_or_surname 

    private 
    def name_or_surname 
    if name.present? || surname.present? 
     errors.add(:name, "must be present") unless name.present? 
     errors.add(:surname, "must be present") unless surname.present? 
    end 
    end 
end 

やバリデータクラスとして

:サイドノートで

class NameValidator < ActiveModel::Validator 
    def validate(record) 
    name, surname = record.name, record.surname 
    if name.present? || surname.present? 
     errors.add(:name, "must be present") unless name.present? 
     errors.add(:surname, "must be present") unless surname.present? 
    end 
    end 
end 

class User < ApplicationRecord 
    validates_with NameValidator 
end 

からforenameの代わり名前を使う - そのコンパニオン用語は、姓と曖昧ではありませんし。

+2

2つの違いは、後者が再利用可能であり、別々にテストできることです。 – max

+0

はい、それはあなたの努力のおかげで、動作します! –

1

あなたは、あなたのモデルにカスタム検証メソッドを作成することによって、またはバリデータクラスを作成することにより、いずれかのRailsで独自の検証を作成することができますconditional validation

class User < ApplicationRecord 
    validates :name, presence: true 
    validates :surname, presence: true, unless: :name_blank? 

    def name_blank? 
    name.blank? 
    end 
end 
+0

要件を満たしていません。 "姓は名前が存在する場合にのみ存在し、その逆も存在する必要があります。" – max

+0

@max - 私の判決はあまりあいまいではないことに気付きました。しかし、この答えに2番目の 'surname_blank'メソッドを追加すると、同じことができます。 –

関連する問題