Ich habe gerade ein einfaches Telefon-Formular <%= f.text_field :phone %>
. :phone
ist ein Integer-Typ, dies erfordert, dass, was auch immer der Benutzer in das Formular eingibt, so etwas wie 5551234
statt der Standardmethode 555-1234
ist. Wie kann ich dem Benutzer erlauben, eine USA-Telefonnummer einzugeben wie Sie sind daran gewöhnt? Ich verstehe, dass ich validates_format_of
verwenden kann, um es zu validieren, aber wenn ich es validiere, wie kann ich die Nummer formatieren und die Telefonnummer in die Datenbank als Ganzzahl einfügen?
ActiveRecord gibt die Eingabe automatisch basierend auf dem Spaltentyp der Datenbank ein. Wenn Ruby eine Zeichenfolge in eine Ganzzahl umwandelt, wird nach dem ersten nicht-numerischen Zeichen alles weggelassen, 123-456-7890
wird zu 123
. Dies geschieht, bevor das Feld im Modell verfügbar ist, so dass die bisher angegebenen Lösungen nicht funktionieren. Sie müssen den Standardschreibzugriffsspeicher überschreiben!
Die ActiveRecord :: Base-Dokumentation erwähnt zwei Möglichkeiten zum Überschreiben des Standardschreibzugriffs (field_name)=
in das Modell, so dass Sie die Eingabe bearbeiten können, um die Nicht-Ziffern zu entfernen, bevor sie typisiert werden muss. Es gibt mindestens drei Varianten:
(1) Überschreibe den Accessor und verwende write_attribute, um das Ergebnis in der Datenbank zu speichern:
%Vor%(2) Oder verwenden Sie die Hash-Notation:
%Vor%(3) Oder (in den neuesten Versionen von ActiveRecord) rufen Sie einfach super auf, als wäre es eine normale (nicht-dynamische) Methode (nicht in der Dokumentation, aber funktioniert):
%Vor%Dies ist nützlich in einer Reihe von Situationen wie Zahlen mit Kommas und funktioniert hervorragend mit Formularen, die eine formatierte Version des vorherigen Feldwerts wie in einem Bearbeitungsformular oder nach einem Fehler in einem neuen / erstellen Formular liefern:
%Vor%Auf diese Weise können Sie die vom Benutzer formatierten Daten (d. h. als String) anzeigen, aber trotzdem eine Ganzzahl in der Datenbank speichern.
Ein letzter Tipp zu MySQL: Sie müssen eine BigInt
verwenden, um eine Telefonnummer zu speichern, ansonsten sehen Sie viele (214) 748-3647
-Telefonnummern in Ihrer Datenbank, da 2,147,483,647
der Maximalwert einer normalen MySQL-Ganzzahl ist - int(11)
- erhaltene Form :integer
in einer Migration. Ein BigInt
in MySQL wird erhalten, indem :limit
auf 8
wie in dieser Migrationslinie gesetzt wird:
Dies gibt Ihnen eine bigint(20)
in Ihrer Tabelle, die Zahlen bis zu 9,223,372,036,854,775,807
verarbeiten kann, was für jede Telefonnummer ausreichen sollte.
sollte den Trick machen. Es entfernt Nicht-Ziffernzeichen.
Sie können auch reguläre Ausdrücke verwenden, wenn Sie etwas ausgefallener sein möchten, aber Sie sollten damit einfach durchkommen.
Wahrscheinlich möchten Sie validieren, was Sie in der Datenbank speichern, da Rails die Validierungen vor dem Speichern überprüft. Sie können jedoch ein before_validation
ausführen, das die Nummer zuerst ändert. Etwas wie das:
Ich bin mir nicht sicher, ob Sie das schon herausgefunden haben, aber ich habe das gleiche Problem wie Reti mit Marks Code gehabt.
Es scheint, dass spezifische self.phone = self.phone.gsub(/\D/, '')
den Trick gemacht haben.
Vielleicht, weil zu diesem Zeitpunkt phone
noch nicht initialisiert ist? Ich bin mir nicht sicher, immer noch ein Neuling hier ...
Tags und Links ruby-on-rails validation