Datumsfelder


#1

Hallo Liste,

folgendes Problem: ich muss eine Datumseingabe verarbeiten. In der
Datenbank gibt es ein Feld vom Typ datetime. Wenn der Benutzer aber ein
nicht valides Datum einträgt, ist das text_field nach dem Absenden des
Formulars leer. Also habe ich mit attr_accessor ein virtuelles Feld
angelegt, in das der Benutzer anstelle des realen Feldes hineinschreibt.
Wenn er nun einen Fehler macht, steht seine fehlerhafte Eingabe nach dem
Absenden zwar wie gewünscht zur Korrektur wieder im text_field bereit,
aber selbiges ist natürlich nicht mehr durch fieldWithErrors als
fehlerhaft markiert. Um die Markierung wiederzubekommen, kopiere ich in
einer after_validation-Methode die errors des realen Feldes in das
virtuelle Feld, was ebenfalls wunderbar funktioniert.

Aber jetzt kommts:

Im View wird nun durch error_messages derselbe Fehler zweimal angezeigt,
einmal davon für ein Feld das der Benutzer gar nicht sieht. Und es gibt
laut http://api.rubyonrails.org/classes/ActiveRecord/Errors.html keine
Möglichkeit, aus den errors selektiv welche herauszulöschen.

Hattet Ihr das Problem schon mal? Gehe ich es vollkommen falsch an? Oder
bin ich auf dem richtigen Weg und habe es schon fast geschafft?

Dank & Gruß,

Raphael


#2

Hallo Raphael,

schau dir mal diesen Railscast an
http://railscasts.com/episodes/32-time-in-text-field

Guido

Zitat von “Raphael J. Schmid” removed_email_address@domain.invalid:


#3

Raphael J. Schmid wrote:

fehlerhaft markiert. Um die Markierung wiederzubekommen, kopiere ich in
einer after_validation-Methode die errors des realen Feldes in das
virtuelle Feld, was ebenfalls wunderbar funktioniert.

Wieso benutzt du eigentlich einen anderen Namen fuer dein Attribut?
Ueberschreibe doch einfach die setter und getter methoden und speichere
den Originalwert irgendwo ab. Dann mit read_attribute und
write_attribute einfach den Wert schreiben. Da sollten dann eigentlich
auch die validations laufen. Hoffe ich zumindest :wink:

Urban


#4

Hallo Guido,

schau dir mal diesen Railscast an
http://railscasts.com/episodes/32-time-in-text-field

danke für die URL! Leider geht der Screencast genau bis zu der von mir
beschriebenen Stelle. Des Problemes mit dem nicht als fehlerhaft
markierten text_field nimmt sich der Autor nicht an.

Es ist allerdings gar nicht so schwer, habe letzte Nacht noch eine
Lösung gefunden: man kann einfach ActiveRecord::Errors um eine
delete-Methode monkey-patchen:

module ActiveRecord
class Errors
def delete(key)
@errors.delete(key.to_s)
end
end
end

Vielleicht nicht die feine Englische, aber es funktioniert :slight_smile:

Gruß,
Raphael


#5

Hallo Urban,

Wieso benutzt du eigentlich einen anderen Namen fuer dein Attribut?
Ueberschreibe doch einfach die setter und getter methoden und speichere
den Originalwert irgendwo ab. Dann mit read_attribute und
write_attribute einfach den Wert schreiben. Da sollten dann eigentlich
auch die validations laufen. Hoffe ich zumindest :wink:

gute Idee, vermeidet unnötige Verwirrung bezüglich der Feldnamen -
vielen Dank! :slight_smile:

  • Raphael