2010-04-08 12 views
6

Mam obszar tekstowy na stronie internetowej, który powinien mieć ograniczoną długość.Zliczanie długości ciągu w javascript i Ruby on Rails

ja dzięki czemu użytkownicy mogą wprowadzić 255 znaków, a ja egzekwowania tego limitu z walidacji szyn:

validates_length_of :body, :maximum => 255 

Jednocześnie, dodałem javascript licznik char jak widać na Twitterze, aby dać feedback użytkownikowi na ile znaków on już używany i wyłączyć przycisk Prześlij, kiedy nad długością i otrzymuję tę długość w JavaScript z połączenia tak:

element.length 

Wreszcie, aby wymusić integralności danych, w mojej bazie danych Postgres utworzyłem to pole jako varchar (255) jako ostatnia linia obrony.

Niestety, te metody liczenia znaków nie wydają się być kompatybilne bezpośrednio. JavaScript liczy się najlepiej, ponieważ liczy, co użytkownicy uważają za liczbę znaków, gdzie wszystko jest pojedynczą postacią. Jednak po tym, jak zgłoszenie trafi Railsy, ​​wszystkie powroty z karetki zostały przekonwertowane na \ r \ n, teraz zajmują 2 znaki, co powoduje, że bliskie połączenie nie sprawdza poprawności Railsów. Nawet jeśli miałbym ręczne kodowanie różnej długości w Railsach, nadal by się nie powiodło, kiedy trafiłoby do bazy danych, ale myślę, że jeszcze tego nie potwierdziłem.

Jaki jest najlepszy sposób, aby wykonać to wszystko tak, jak tego chciał użytkownik?

Najlepsze rozwiązanie: podejście, które pozwoli mi spełnić oczekiwania użytkowników, gdzie każda postać dowolnego typu jest tylko jedną postacią. Jeśli oznacza to zwiększenie długości pola bazy danych varchar, użytkownik nie powinien być w stanie podstępnie wysłać ręcznie spreparowanego postu, który tworzy wiersz zawierający więcej niż 255 liter.

Nieco akceptowalne rozwiązanie: zmiana javascript, która pozwala użytkownikowi zobaczyć rzeczywistą liczbę znaków, tak, że uderzenie zwrotne zwiększa liczbę znaków o 2, jednocześnie poprawnie posługując się wszystkimi symbolami, które mogą mieć te dziwne zachowania.

Odpowiedz

0

Polecam przechowywanie danych z CR-LF konwertowane do pojedynczego LF. Pozbądź się weryfikacji szyn, ponieważ jest to niepotrzebne, gdy pole bazy danych ma ustawioną szerokość. Zamiast tego spraw, aby Railsy konwertowały CRLF na LF przed zapisaniem.

+1

Ale czy CR-LF jest jedyną specjalną postacią, na którą muszę uważać, czy też mogą być inne rzeczy, które ją wyzwalają? Ponadto weryfikacja Railsów jest nadal potrzebna, aby można było wyświetlić użytkownikowi ładne komunikaty o problemach. –

+0

Jeśli ustawiłeś bazę danych i kod HTML na kodowanie UTF-8, nie powinieneś mieć żadnych innych problemów. Zapomnij o ładnych wiadomościach, ponieważ nigdy nie będą wyświetlane - JavaScript po stronie klienta nie pozwoli przesłać zbyt długich danych. Dla 0,01% użytkowników z wyłączoną obsługą JavaScriptu nie warto. – Tometzky

+1

Jeśli nie ma sprawdzania poprawności Railsów, baza danych po cichu skróci łańcuch, a użytkownik nigdy się o tym nie dowie. Jest to anty-wzór, którego należy unikać. –