2012-11-21 2 views
8

を検証:私は、入力フィールドを持っている私の見解ではレール、私はのようにコメントの最大長を制限するコメントモデル持つ入力フィールドのMAXLENGTH

validates_length_of :comment, :maximum => 500 

が宣言:

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

入力フィールドの制限は期待どおりに機能し、最大500文字に制限されます。

ただし、モデルの制限は期待どおりに機能しません。改行を含む500文字のテキストは、検証エラーを示します。このモデルは、改行を2文字でカウントします(また、他の文字も可能です)。この入力が動作しますので、

、無改行:

abc abc abc abc.... 

これはしません:

abc 

abc 
. 
. 

は1つの文字として改行(およびその他)をカウントするvalidates_length_ofを作るための簡単な方法はありますか? 。

===結果1 ===

私はジョンとダリオからの偉大な答えを組み合わせて、これを作成しました:

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

答えて

4

ブラウザは、効果的 それぞれとしてテキストエリアから改行を送る "\ rをする\ n" Railsのデフォルトの長さバリデーターを使用する場合、改行は2つの文字としてカウントされます

したがって、コントローラーで置換メソッドを作成するか、カスタム長さバリデーターを作成してください。

4

長さバリデーターのtokenizerオプションを使用すると、改行ではなく単語だけをカウントできます。

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

詳細については、こちらを見てみましょう:Active Record Validations and Callbacks

1

あなたは

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

あなたが期待する正確に文字列のサイズを取得し、この方法を使用することができます。

このテキストエリア入力:

これは

改行

の文字列です。これは文字列です」この文字列に

をリード\ r \ na改行 "

デフォルトあたり

レールバリデータは各文字をカウントし、あなたが正規表現でトークナイザを使用する場合は36

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

の長さを取得します/./あなたが期待どおりには、各文字+スペースは、1 +(35の結果を得ます改行)は\nを示していますが、代わりに\rとなります。あなたはhttp://rubular.com/

で少し遊ぶことができる正規表現の詳細については http://ruby-doc.org/core-2.2.0/String.html#method-i-scan

を参照してくださいscan文字列メソッドの詳細については

"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 

関連する問題