2010-12-17 7 views
1

Ich habe eine Dezimalzahl price Feld in meinem Produktmodell und eine einfache Validierung:Wie verhindert man, dass Rails den Inhalt des Eingabefeldes ändert, wenn die Validierung fehlschlägt?

class Price < ActiveRecord::Base 
    ... 
    validates_numericality_of :price 
    ... 
end 

Wenn ich versehentlich geben 33.0p, heißt es: „Der Preis ist keine Zahl“ (Ich stimme zu), und ändert die Inhalt des Eingabefeldes von 33.0p bis 33.0.

Also, wenn ich 33.0p und drücken Sie die Schaltfläche Senden schnell (denken, dass alles in Ordnung ist), werde ich die Fehlermeldung erhalten. Dann werde ich in das Eingabefeld schauen, um zu sehen, was falsch ist. Aber da werde ich eine gültige Nummer sehen (33.0), und ich werde mich fragen "Was ist los ...?".

Gibt es eine Möglichkeit zu verhindern, dass Rails den Inhalt des Eingabefeldes ändert, wenn die Validierung fehlschlägt?

Antwort

2

Eine weitere Option zu verwenden read_attribute_before_type_cast wäre, dh f.text_field(:price, :value => @product.read_attribute_before_type_cast(:price)).

+1

Das ist noch besser: ': value => @ product.price_before_type_cast'. Danke vielmals !!! –

1

Der Grund dafür ist der gleiche wie meine Antwort auf Ihre other question; Rails konvertiert die Eingabe an einem bestimmten Punkt während des Prozesses in einen Gleitkommawert und daher wird der Gleitkommawert angezeigt.

Ich habe dies nicht getestet, aber Sie können versuchen, den Wert des Textfelds auf params[:product][:price] zu überschreiben. In der Theorie würde dies in etwa so aussehen:

f.text_field(:price, :value => (params[:product] ? params[:product][:price] : @product.price)) 
+0

Das funktioniert! Danke vielmals! –

Verwandte Themen