2012-05-30 7 views
20

Wenn Sie eine sehr komplexe Validierung codieren müssen, liegt der Fehler manchmal nicht in einem bestimmten Attribut, sondern in einer Kombination aus mehreren.Ist es möglich, einem ActiveRecord-Objekt Fehler hinzuzufügen, ohne sie einem bestimmten Attribut zuzuordnen?

Zum Beispiel, wenn ich validieren möchte, dass der Zeitraum zwischen: start_date und: end_date keinen Sonntag enthält, gehört der Fehler nicht speziell zu einem dieser Felder, aber die Add-Methode für Fehler muss angegeben werden.

Antwort

29

Versuch, etwas zu tun wie folgt aus:

# Your Model.rb 
validate :my_own_validation_method 

... 

private 

def my_own_validation_method 
    if there_is_no_sunday_in_the_range 
     self.errors[:base] << "You must have a Sunday in the time range!" 
    end 
end 

Grundsätzlich können Sie Ihre eigenen komplexen Validierungen zu einem Modell hinzufügen, und wenn Sie sehen, dass etwas fehlerhaft geschehen ist, können Sie eine Fehler Zeichenfolge in dem Array hinzufügen von Fehler.

+1

Perfekt, das ist genau das, was ich brauchte. Konnte es nicht in der Dokumentation finden –

+2

Was ist: Basis in der Fehler-Hash? – holaSenor

+4

Nun, normalerweise können Sie einem bestimmten Attribut einen Fehler hinzufügen. Wenn Sie zum Beispiel ein 'User'-Modell mit einem' age'-Attribut haben, möchten Sie möglicherweise einen Fehler für dieses Attribut hinzufügen, sodass Sie 'self.errors [: age] <<" schreiben können, das nicht kleiner als 0 sein kann "', die einen Fehler wie "Alter kann nicht weniger als 0 sein" machen. Wenn es sich jedoch nicht um ein bestimmtes Attribut handelt, können Sie es zur Basis hinzufügen, also zum Modell selbst. Also 'self.errors [: base] <<" Alles ist falsch! "' Macht die Fehlermeldung "Alles ist falsch!"; Es ist nicht mit einem bestimmten Attribut verbunden. – MrDanA

5

Sie können errors[:base] verwenden, um allgemeine Fehler hinzuzufügen, die nicht spezifisch mit einem Attribut verbunden sind - rails guide link.

7
model_instance.errors[:base] << "msg" 
1

können Sie nennen tatsächlich die Raute-Taste, was auch immer Sie möchten:

instance.errors[:case_of_the_sundays] << "Error, son." 

Nur ein wenig mehr beschreibend.

0

Die obigen Antworten sind veraltet. Ab Rails 5 müssen Sie die Methode ActiveModel::Errors add mit :base als ersten Parameter aufrufen. Siehe das Beispiel unten.

model_instance.errors.add(
    :base, 
    :name_or_email_blank, 
    message: "either name or email must be present" 
) 
Verwandte Themen