Ich möchte ein Datum in meinem Modell in Ruby on Rails überprüfen. Die Werte für Tag, Monat und Jahr werden jedoch bereits in ein falsches Datum konvertiert, wenn sie mein Modell erreichen.
Wenn ich beispielsweise in meiner Ansicht den 31. Februar 2009 Model.new(params[:model])
eingebe und ihn in meinem Controller verwende, wird er in "3. März 2009" konvertiert, was mein Modell dann als gültiges Datum ansieht, was es ist, aber es ist falsch.
Ich möchte diese Validierung in meinem Modell durchführen können. Gibt es eine Möglichkeit, die ich kann, oder gehe ich völlig falsch vor?
Ich habe diese " Datumsüberprüfung " gefunden, in der das Problem behandelt wird, die jedoch nie behoben wurde.
ruby-on-rails
ruby
validation
date
Megamug
quelle
quelle
Antworten:
Ich vermute, Sie verwenden den
date_select
Helfer, um die Tags für das Datum zu generieren. Eine andere Möglichkeit besteht darin, einen ausgewählten Formular-Helfer für die Felder Tag, Monat und Jahr zu verwenden. So (Beispiel, das ich verwendet habe, ist das Datumsfeld created_at):Und im Modell validieren Sie das Datum:
Wenn Sie nach einer Plugin-Lösung suchen, würde ich das validates_timeliness- Plugin überprüfen. Es funktioniert so (von der Github-Seite):
Die Liste der verfügbaren Validierungsmethoden lautet wie folgt:
quelle
Verwendung des chronischen Edelsteins:
quelle
Chronic.parse(from_date_before_type_cast)
, um die Eingabe des Zeichenfolgenwerts zu erhalten. Andernfalls würde Rails die Zeichenfolge typisieren,to_date
da das Feld eindatetime
Feld war.Wenn Sie Rails 3- oder Ruby 1.9-Kompatibilität wünschen, versuchen Sie es mit dem Juwel date_validator .
quelle
Active Record bietet Ihnen
_before_type_cast
Attribute, die die Rohattributdaten vor der Typumwandlung enthalten. Dies kann nützlich sein, um Fehlermeldungen mit Pre-Typecast-Werten zurückzugeben oder nur Validierungen durchzuführen, die nach Typecast nicht möglich sind.Ich würde Daniel Von Fanges Vorschlag, den Accessor zu überschreiben, scheuen, da die Validierung in einem Accessor den Accessor-Vertrag geringfügig ändert. Active Record verfügt explizit über eine Funktion für diese Situation. Benutze es.
quelle
Da Sie die Datumszeichenfolge verarbeiten müssen, bevor sie in Ihrem Modell in ein Datum konvertiert wird, würde ich den Accessor für dieses Feld überschreiben
Angenommen, Ihr Datumsfeld ist
published_date
. Fügen Sie dies Ihrem Modellobjekt hinzu:quelle
Ein bisschen spät hier, aber dank " Wie validiere ich ein Datum in Schienen? " Ich habe es geschafft, diesen Validator zu schreiben. Die Hoffnung ist für jemanden nützlich:
In deinem
model.rb
quelle
Hier ist eine nicht chronische Antwort.
quelle
"1/1/2013".is_a?(Date)
- Das Datum stammt aus Benutzereingaben und wird daher als Zeichenfolge eingegeben. Ich müsste es zuerst als Datum analysieren?Date.parse("1/1/2013").is_a?(Date)
, aber man konnte sehen, dass es wahrscheinlich auch kein Datum ist, wenn es überhaupt nicht analysiert wird.Sie können Datum und Uhrzeit wie folgt überprüfen (in einer Methode irgendwo in Ihrem Controller mit Zugriff auf Ihre Parameter, wenn Sie benutzerdefinierte Auswahlen verwenden) ...
quelle
Haben Sie das
validates_date_time
Plug-In ausprobiert ?quelle