2017-10-24 7 views
0

Ich habe einfach ApplicationRecord Klasse wie folgt:Rails - validieren Feld, wenn ein anderes Feld nicht leer ist

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

Nun würde Ich mag meinen Code zu modifizieren, so dass die Felder nur vorhanden sein muss, wenn einer von ihnen ist Geschenk. Also, ich brauche etwas zu haben, wie:

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

I Standard Rails Formulare verwenden, so im Fall ungültiger Form würde Ich mag meine benutzerdefinierte Validierungsnachricht mit konkretem Feld zugeordnet ist zeigen, wie es bei Standard arbeitet Validierungen. Wie kann ich das machen?

+1

Sie können einen 'ActiveModel :: Validator 'erstellen, der das Vorhandensein von beiden oder die Abwesenheit von beiden prüft. –

+0

@AlejandroMontilla das ist eigentlich eine viel bessere Idee, als eine Reihe von Logik in die 'if:' und 'ifere:' Optionen für die normale Anwesenheitsvalidierung zu schieben. http://guides.rubyonrails.org/active_record_validations.html#performing-custom-validations – max

Antwort

2

verwenden Sie können Ihre eigenen Validierungen in Rails erstellen entweder durch eine benutzerdefinierte Validierungsmethode in Ihrem Modell erstellen oder eine Validator-Klasse zu schaffen.

Was ein Validator macht, ist wirklich einfach - Sie führen ein Prädikat für das Modell und wenn es nicht erfüllt ist, fügen Sie eine Fehlermeldung zum Fehlerobjekt im Modell hinzu.

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 

Oder als Validator-Klasse:

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 

On a side note - verwenden Vornamens statt Namen - sei der Begleiter Begriff Name und ist nicht eindeutig.

+2

Der Unterschied zwischen den beiden ist, dass der spätere wiederverwendbar ist und separat getestet werden kann. – max

+0

Ja, es funktioniert, danke für Ihre Mühe! –

1

sollten Sie conditional validation

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

    def name_blank? 
    name.blank? 
    end 
end 
+0

Erfüllt nicht die Anforderung. "Nachname sollte nur vorhanden sein, wenn der Name auch vorhanden ist und umgekehrt." – max

+0

@max - Ich erkannte, dass dies mein Satz war wenig zweideutig. Wenn ich jedoch eine zweite 'Nachname_Blank'-Methode zu dieser Antwort hinzufüge, kann ich dasselbe erreichen. –

Verwandte Themen