7

Ich habe eine Rails 3.2.18 App, wo ich versuche, eine bedingte Validierung für ein Modell zu tun.Rails bedingte Validierung in Modell

Im Anrufmodell gibt es zwei Felder: location_id (eine Zuordnung zu einer Liste von vordefinierten Standorten) und: location_other (ein Textfeld, in dem jemand einen String oder in diesem Fall eine Adresse eingeben kann).

Was ich tun möchte, ist Validierungen beim Erstellen eines Anrufs zu verwenden, wobei entweder die: location_id oder: location_other als gültig bestätigt wird.

Ich habe die Rails Validierungen Guide gelesen und bin ein wenig verwirrt. Hatte gehofft, dass jemand etwas Licht darauf werfen könnte, wie man das leicht mit einem Konditional macht.

+1

Ich verstehe die Kernfrage nicht ganz. Geht es darum, wie man die "if" und "ibm" Optionen der valdates Makros verwendet? Oder geht es darum, nur bestimmte Modellattribute zu validieren, wenn ein Modell von einigen Controller-Aktionen (und nicht von anderen) gespeichert wird? – pdobb

+0

Sorry für die Verwirrung. Ich versuche herauszufinden, ob und wann ich verwende, wenn ich einen Datensatz erstelle/speichere. Das Endziel besteht darin, zu überprüfen, ob beim Erstellen/Speichern eines Datensatzes entweder: location_id oder: location_other gesetzt ist. Ich bin mir nicht sicher, wie es geht. – nulltek

Antwort

14

Ich glaube, das ist das, was Sie suchen:

class Call < ActiveRecord::Base 
    validate :location_id_or_other 

    def location_id_or_other 
    if location_id.blank? && location_other.blank? 
     errors.add(:location_other, 'needs to be present if location_id is not present') 
    end 
    end 
end 

location_id_or_other ist eine Methode, benutzerdefinierte Validierung, die, wenn location_id und location_other prüft leer sind. Wenn beides der Fall ist, wird ein Validierungsfehler hinzugefügt. Wenn das Vorhandensein von location_id und ein exclusiv oder ist, d. H. Nur einer der beiden vorhanden sein kann, nicht beide und nicht beide, dann können Sie die folgende Änderung an dem if Block in dem Verfahren vornehmen.

if location_id.blank? == location_other.blank? 
    errors.add(:location_other, "must be present if location_id isn't, but can't be present if location_id is") 
end 

Alternative Lösung

class Call < ActiveRecord::Base 
    validates :location_id, presence: true, unless: :location_other 
    validates :location_other, presence: true, unless: :location_id 
end 

Diese Lösung (nur) funktioniert, wenn das Vorhandensein von location_id und location_other exklusiv ist oder.

Überprüfen Sie die Rails Validation Guide für weitere Informationen.

+1

Vielen Dank für die schnelle Antwort. Die erste Lösung, die eine benutzerdefinierte Validierung erstellt hat, hat den Zweck erfüllt. Ich habe gerade ein paar Nachforschungen zu benutzerdefinierten Validierungen angestellt und angefangen, etwas Ähnliches zu schreiben, danke, dass du mir Zeit gespart und mich gelehrt hast. Ich schätze es! – nulltek

+0

Kein Problem! Und lesen Sie den [Rails Validation Guide] (http://guides.rubyonrails.org/active_record_validations.html) (den ich auch in meiner aktualisierten Antwort verlinkt habe) für weitere Informationen über Validierungen. –

+0

Danke! Das habe ich gelesen und ging davon, als ich anfing, etwas Ähnliches zu schreiben. Aber danke nochmal dafür, dass du so schnell hereingekommen bist und eine einfache Antwort gefunden hast. Sehr geschätzt. – nulltek