У меня есть текстовая область на веб-сайте, длина которой должна быть ограничена.
Я позволяю пользователям вводить 255 символов и применяю этот лимит с помощью проверки Rails:
validates_length_of :body, :maximum => 255
В то же время я добавил счетчик символов javascript, как вы видите в Twitter, чтобы дать отзыв пользователю о том, сколько символов он уже использовал, и отключить кнопку отправки при превышении длины, и получаю эту длину в Javascript с таким вызовом:
element.length
Наконец, для обеспечения целостности данных в моей базе данных Postgres я создал это поле как varchar (255) в качестве последней линии защиты.
К сожалению, эти методы подсчета символов не могут быть напрямую совместимы. Javascript считается лучшим в том смысле, что пользователи считают количество символов, в котором все является одним символом. Однако, как только отправка попадает в Rails, все возвраты каретки были преобразованы в \ r \ n, теперь занимают место в 2 символа, что делает закрытый вызов неудачным при проверке Rails. Я думаю, что даже если бы мне пришлось вручную кодировать валидацию другой длины в Rails, она все равно не работала бы при попадании в базу данных, хотя я еще не подтвердил это.
Какой лучший способ заставить меня работать так, как этого хотел бы пользователь?
Лучшее решение: подход, который позволил бы мне соответствовать ожиданиям пользователей, где каждый символ любого типа - это только один символ. Если это означает увеличение длины поля базы данных varchar, пользователь не должен иметь возможность скрытно отправлять сообщение, созданное вручную, которое создает строку, содержащую более 255 букв.
Несколько приемлемое решение: изменение javascript, позволяющее пользователю видеть реальное количество символов, так что нажатие на return увеличивает счетчик на 2 символа за раз, при этом должным образом обрабатывая все символы, которые могут иметь такое странное поведение.