2012-11-21 25 views
8

Ho un modello commento in cui mi limito la lunghezza massima di un commento del tipo:Rails, convalidare maxlength di campo di input

validates_length_of :comment, :maximum => 500 

A mio avviso ho campo di inserimento dichiarato:

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

Il il limite sul campo di input funziona come previsto, limita al massimo 500 caratteri.

Tuttavia, il limite del modello non funziona come previsto. Un testo di 500 caratteri con newline fornisce un errore di convalida. Il modello conta le nuove righe come due caratteri (e possibili altri caratteri). Così

Questo ingresso funzionerà, no a capo:

abc abc abc abc.... 

Questo non:

abc 

abc 
. 
. 

C'è un modo semplice per fare validates_length_of a contare a capo (e altri) come un carattere? .

=== === Result1

ho unito le grandi risposte da Jon e Dario e ha creato questo:

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

risposta

4

browser inviano nuove righe da textarea come "\ r \ n" efficacemente ogni newline viene conteggiato come due caratteri quando si utilizza il validatore della lunghezza predefinita Rails

Quindi, fare un metodo di sostituzione nel controller o creare un validatore di lunghezza personalizzato.

4

È possibile utilizzare l'opzione tokenizer del validatore di lunghezza per contare solo le parole, non le interruzioni di riga.

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

Per ulteriori informazioni, date un'occhiata qui: Active Record Validations and Callbacks

1

si potrebbe usare

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

questo modo si ottiene esattamente la dimensione della stringa che ci si aspetta.

Questo ingresso textarea:

Questa è una stringa con

un'interruzione di linea

conduce a questa stringa

"Questa è una stringa con un \ r \ na line break "

per impostazione predefinita, il rotaie validatore conta ogni personaggio e ottiene una lunghezza di 36

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

Se si utilizza il tokenizzatore con l'espressione regolare /./ si ottiene un risultato di 35 come ci si aspetterebbe (ogni carattere + spazi + 1 newline) perché stacca lo \n ma conteggia lo \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 

Per ulteriori informazioni sul metodo di stringa scan vedere http://ruby-doc.org/core-2.2.0/String.html#method-i-scan

Per ulteriori informazioni sulle espressioni regolari si poteva giocare un po 'con http://rubular.com/

Problemi correlati