Ruby on Rails: Überprüfen und Ändern einer Telefonnummer

7

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?

    
Reti 30.07.2010, 00:44
quelle

4 Antworten

17

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:

%Vor%

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.

    
Niels 20.12.2011 03:31
quelle
12
%Vor%

sollte den Trick machen. Es entfernt Nicht-Ziffernzeichen.

    
Mark Thomas 30.07.2010 02:23
quelle
0
%Vor%

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:

%Vor%

Ссылка

    
Karl 30.07.2010 00:56
quelle
0

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 ...

    
Josiah 15.12.2011 14:09
quelle

Tags und Links