2010-04-08 9 views
6

Ich habe einen Textbereich auf einer Website, die in der Länge begrenzt sein sollte.String Länge in Javascript und Ruby on Rails zählen

Ich bin so dass Anwender 255 Zeichen eingeben, und bin die Durchsetzung dieser Grenze mit einer Rails-Validierung:

validates_length_of :body, :maximum => 255 

Zur gleichen Zeit habe ich einen Javascript-char Zähler hinzugefügt, wie Sie auf Twitter zu sehen, zu geben, Feedback an den Benutzer auf, wie viele Charaktere, die er bereits verwendet wird, und die Submit-Button, wenn über die Länge zu deaktivieren, und ist, dass die Länge in Javascript mit einem Aufruf wie folgt erhalten:

element.length 

Schließlich Datenintegrität zu erzwingen, In meiner Postgres-Datenbank habe ich dieses Feld als erstellt ein varchar (255) als letzte Verteidigungslinie.

Leider scheinen diese Methoden zum Zählen von Zeichen nicht direkt kompatibel zu sein. Javascript zählt am besten, da es zählt, was Benutzer als Anzahl von Zeichen betrachten, bei denen alles ein einzelnes Zeichen ist. Sobald die Eingabe jedoch auf Rails trifft, wurden alle Zeilenumbrüche in \ r \ n umgewandelt und belegen nun zwei Zeichen Speicherplatz, was dazu führt, dass ein eingehender Anruf die Validierungen von Schienen fehlschlägt. Selbst wenn ich eine andere Längenvalidierung in Rails handcodieren sollte, würde es immer noch fehlschlagen, wenn es die Datenbank trifft, obwohl ich das noch nicht bestätigt habe.

Was ist der beste Weg für mich, all das so zu machen, wie der Benutzer es möchte?

Beste Lösung: ein Ansatz, der es mir ermöglichen würde, die Erwartungen der Benutzer zu erfüllen, wobei jedes Zeichen eines beliebigen Typs nur aus einem Zeichen besteht. Wenn das bedeutet, die Länge des varchar-Datenbankfelds zu erhöhen, sollte ein Benutzer nicht in der Lage sein, manuell einen handgeschriebenen Post zu senden, der eine Zeile mit mehr als 255 Buchstaben erstellt.

Etwas akzeptable Lösung: eine JavaScript-Änderung, die es dem Benutzer ermöglicht, die tatsächliche Anzahl der Zeichen zu sehen, so dass der Rückgabewert den Zähler um jeweils 2 Zeichen erhöht, während alle Symbole korrekt behandelt werden.

Antwort

0

Ich würde empfehlen, Daten mit CR-LF in einzelne LF konvertiert zu speichern. Entfernen Sie die Schienenverifizierung, da dies nicht erforderlich ist, wenn das Datenbankfeld die Breite festgelegt hat. Lassen Sie Rails stattdessen CRLF vor dem Speichern in LF konvertieren.

+1

Aber ist CR-LF das einzige Sonderzeichen, auf das ich achten muss, oder könnte es andere Dinge geben, die das auslösen? Außerdem wird weiterhin die Rails-Verifizierung benötigt, damit dem Benutzer bei Problemen nette Nachrichten angezeigt werden können. –

+0

Wenn Sie sowohl die Datenbank als auch einen HTML-Code auf UTF-8-Codierung eingestellt haben, sollten Sie keine anderen Probleme haben. Vergessen Sie nette Nachrichten, da diese nie angezeigt werden - Ihr clientseitiges JavaScript erlaubt keine zu langen Daten. Für 0,01% der Benutzer mit deaktiviertem JavaScript lohnt es sich nicht. – Tometzky

+1

Wenn es keine Rails-Validierung gibt, schneidet die Datenbank die Zeichenfolge still und der Benutzer wird nie davon erfahren. Dies ist ein Anti-Pattern, das vermieden werden sollte. –