Rails date_select Helfer und Validierung

9

Ich habe ein Datumsfeld in einem modellgestützten Formular in meiner Rails App:

%Vor%

Es wird im Modellcode validiert mit:

%Vor%

Wenn der Benutzer einen Teilwert wie z. B. nur das Jahr eingibt, wird das Formular leider weiterhin fehlerfrei übergeben. Stattdessen wird ein funky Datum Wert in die db geschrieben. Wie mache ich alle drei Felder obligatorisch?

Ich würde gerne eine benutzerdefinierte Validierung dafür schreiben, aber ich weiß nicht, wie ich richtig auf die einzelnen Teile des Geburtstagselements zugreifen soll. Wie kann ich das tun?

Danke! Moe

    
Moe 21.07.2010, 00:11
quelle

4 Antworten

2

Ich denke, Sie müssten die Validierung im Controller selbst erstellen.

Die Datumsteile werden an birthday(1i) , birthday(2i) und birthday(3i) übergeben. Das Problem dabei ist, dass sie sofort bei der Übergabe der Attribute und damit vor den Validierungen vergeben werden.

Sie könnten auch die Methode attributes= überschreiben, um dort Ihre eigene Validierung zu erstellen, aber ich würde Ihnen das nicht empfehlen.

Beachten Sie, dass es bei Validierungen sinnvoll sein kann, auch gegen ein falsches Datum zu validieren. (zum Beispiel der 31. Februar, der, wenn er bestanden wird, den 2. März und keinen Fehler ergeben wird).

Ich denke, das Hauptproblem hier ist, dass ActiveRecord die leeren Werte tatsächlich durch 1 ersetzt, bevor die Date erstellt wurde, was bedeutet, dass wenn der Besucher nur das Jahr passiert, das Datum am ersten Tag erstellt wird Januar dieses Jahres. Ich denke, das ist ein zu erwartendes Verhalten, um nur eines von Jahr / Monat / Tag auswählen zu lassen und trotzdem ein nützliches Datum zu erstellen.

    
Jimmy Stenke 07.03.2011 19:14
quelle
1

Im Zusammenhang mit diesem Post ist dies das Beste Lösung, die ich gefunden habe. Ich sollte jedoch hinzufügen: Tag,: Monat,: Jahr als attr_accessible, was verstehe ich nicht warum .. (wegen Validierung? bitte lassen Sie mich wissen ..)

Benutzer.rb

%Vor%

Benutzerregistrierungsformular

%Vor%     
benoitr 08.03.2011 02:52
quelle
0

Sie können die Methode validate_on_create wie folgt überschreiben:

%Vor%     
sespindola 21.07.2010 00:42
quelle
0

Nachdem ich Benoitrs Vorschlägen gefolgt bin, habe ich etwas Ähnliches mit Hilfe von virtuellen Attributen gefunden. Auf der View-Seite gibt es 3 separate Auswahlmöglichkeiten (Jahr, Monat, Tag) innerhalb eines 'fields_for'. Die Daten werden der Massenzuweisung des Controllers übergeben (keine Änderungen im Controller, siehe asciicasts # 16 ) und dann an den Controller übergeben ein Getter / Setter (dh virtuelles Attribut) im Modell. Ich verwende Rails 3.0.3 und simpleForm für den View-Code.

In der Ansicht:

%Vor%

Im Modell:

%Vor%

'design_date_attr' ist das virtuelle Attribut, das den Wert von design_date in der Datenbank festlegt. Der Getter übergibt einen Hash, der dem ähnelt, was im Formular übermittelt wird. Der Setter prüft auf Leerzeichen und erstellt ein neues Datumsobjekt und setzt es sowie die Fehlervariable. Der benutzerdefinierte Validator: design_date_validator sucht nach der Fehlerinstanzvariablen und legt die Fehlervariable fest. Ich habe ': base' verwendet, weil der Variablenname nicht vom Menschen lesbar war und die Verwendung von base diesen Wert aus der Fehlerzeichenfolge entfernt.

Ein paar Dinge, die zu refaktorieren sind, könnten die Instanzvariablen für die Fehlerprüfung sein, aber es scheint zumindest zu funktionieren. Wenn jemand eine bessere Möglichkeit zum Aktualisieren der Date-Objekte kennt, würde ich es gerne hören.

    
James 12.08.2011 04:56
quelle

Tags und Links