2010-09-22 3 views
8

Ich habe ein Objekt mit einem Attribut namens Wert, der vom Typ große Dezimalzahl ist. In der Klassendefinition habe ich validates_numericality_of.Validierung vor Attribut-Setter können Cast

jedoch, wenn i:

a.valid? => true 

Wie kommen die Validierung vor der Typumwandlung Feuer:

a.value = 'fire' 

‚Feuer‘ landet auf den richtigen Typ ausgelöst wird, bevor die Validierung so typisieren zu werden?

Dank

Dan

Antwort

14

Von ActiveRecord::Base docs:

Manchmal wollen Sie die rohen Attributdaten zu lesen, ohne dass die säulen bestimmt seinen ersten Kurs Typumwandlung in der Lage sein laufen. Dies kann durch unter Verwendung der <attribute>_before_type_cast Accessoren, die alle Attribute haben, erfolgen. Wenn zum Beispiel Ihr Account Modell über ein Kontostandsattribut verfügt, können Sie account.balance_before_type_cast oder account.id_before_type_cast anrufen.

Dies ist besonders nützlich in Validierung Situationen, in denen der Benutzer könnte eine Zeichenfolge für eine ganze Zahl Feld liefern und Sie möchten in einer Fehlermeldung die Original-String zurück anzuzeigen. Der Zugriff auf das Attribut würde normalerweise den String auf 0 typisieren, was nicht das ist, was Sie wollen.

+0

Fyi, wenn Sie dies tun möchten, ohne seltsame Validierungsnachrichten in Ihren Ansichten zu bekommen. Z.B. " vor Typumwandlung muss eine Zahl sein" Sie können einen [benutzerdefinierten Validator] (http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-validators) erstellen, der anstelle von "# {attribute} _before_type_cast" '' checkt Überprüfen Sie nur das Attribut selbst. – Ajedi32

+0

@ Ajedi32 Oder übergeben: Nachrichtenoption zu Validator? – sheerun

+2

@sheerun Nein, das wird nicht funktionieren, weil die Nachrichtenoption nicht das Attribut ändert, mit dem der Validierungsfehler verknüpft ist. (Z. B. unter " vor dem Typ muss eine Zahl sein"), können Sie nur diese Option verwenden, um den Teil "Teil einer Nachricht" zu ändern. – Ajedi32

1

Ein neues Juwel wurde erstellt, um validate types in rails zu helfen.

Ein explanatory blog post existiert, um mehr von dem "warum" zu beantworten, das es in erster Linie geschaffen wurde.

Mit dieser Bibliothek könnte Ihr Code sein:

class SomeObject < ActiveRecord::Base 
    validates_type :value, :big_decimal 
end 

Diese eine Ausnahme ausgelöst wird, wenn irgendetwas außer einem Schwimmer zu value zugeordnet ist, anstatt die value zu einem BigDecimal und speichern sie leise Gießen.