2012-11-21 14 views
8

Mam modelu komentarz gdzie ograniczyć maksymalną długość komentarza jak:Rails, walidacji maxLength pola wejściowego

validates_length_of :comment, :maximum => 500 

Moim zdaniem mam pole wejściowe oświadczył:

<%= f.text_area :comment,:as => :text, :maxlength => 500 %> 

Limit pola wejściowego działa zgodnie z oczekiwaniami, ogranicza się do maksymalnie 500 znaków.

Jednak limit modelu nie działa zgodnie z oczekiwaniami. Tekst 500 znaków z znakami nowej linii powoduje błąd sprawdzania poprawności. Model liczy nowe linie jako dwa znaki (i możliwe inne znaki również). Więc

Wejście to będzie działać, żadne nowe linie:

abc abc abc abc.... 

To nie będzie:

abc 

abc 
. 
. 

Czy istnieje prosty sposób na zarabianie validates_length_of liczyć nowe linie (i innych) jako jeden znak? .

=== Wynik1 ===

że łączy wielkie odpowiedzi Jon Dario, tworząc w ten sposób:

before_validation(:on => :create) do 
    self.comment = comment.gsub("\r\n","\n") if self.comment 
end 

Odpowiedz

4

przeglądarki wysłać nowe linie od pola tekstowe jak "\ r \ n" Skutecznie każdy znak nowej linii jest liczony jako dwa znaki w przypadku używania domyślnego weryfikatora długości Railsa

Tak więc albo wykonaj metodę zamień w kontrolerze, albo utwórz niestandardowy sprawdzacz długości.

4

Można użyć opcji tokenizera walidatora długości, aby zliczyć tylko wyrazy, a nie podziały wierszy.

validates :comment, length: { 
    maximum: 500, 
    tokenizer: lambda { |str| str.scan(/\w+/) } 
} 

Aby uzyskać więcej informacji, zajrzyj tutaj: Active Record Validations and Callbacks

1

Można użyć

validates :comment, length: { 
    maximum: 500, 
    tokenizer: lambda { |str| str.scan(/./) } 
} 

ten sposób można uzyskać dokładnie taki rozmiar ciąg można oczekiwać.

Wejście textarea:

To jest łańcuch z

przerwie linia

prowadzi do tego łańcucha

„To jest łańcuch z \ r \ n line break "

domyślnie walidator szyny liczy się każdy znak i dostaje długość 36

"This is a string with \r\na line break".length 
=> 36 

Jeśli używasz tokenizera z regexp /./ można uzyskać wynik 35 jak można oczekiwać (każdy znak + spacje + 1 newline), ponieważ stripts \n, ale zamiast tego liczy się \r.

"This is a string with a\r\na line break".scan(/./) 
=> ["T", "h", "i", "s", " ", "i", "s", " ", "a", " ", "s", "t", "r", "i", "n", "g", " ", "w", "i", "t", "h", " ", "a", "\r", "a", " ", "l", "i", "n", "e", " ", "b", "r", "e", "a", "k"] 

"This is a string with \r\na line break".scan(/./).count 
=> 35 

Aby uzyskać więcej informacji na temat sposobu strun scan zobaczyć http://ruby-doc.org/core-2.2.0/String.html#method-i-scan

Aby uzyskać więcej informacji na regexp można grać trochę z http://rubular.com/

Powiązane problemy