9

次のようなコメントの最大長を制限するコメント モデルがあります。

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===

Jon と Dario からの素晴らしい回答を組み合わせて、これを作成しました。

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

3 に答える 3

5

ブラウザーは textareas から "\r\n" として改行を送信します Rails のデフォルトの長さバリデーターを使用すると、事実上、各改行は 2 文字としてカウントされます

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

于 2012-11-21T15:46:18.433 に答える
5

長さバリデーターのトークナイザーオプションを使用して、改行ではなく単語のみをカウントできます。

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

詳細については、こちらをご覧ください: Active Record Validations and Callbacks

于 2012-11-21T16:08:00.657 に答える
2

あなたが使用することができます

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

このようにして、期待する文字列サイズを正確に取得します。

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

これは

改行

この文字列につながります

「これは \r\n 改行のある文字列です」

デフォルトでは、Rails Validator は各文字をカウントし、長さ 36 を取得します。

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

正規表現でトークナイザーを使用すると、期待/./どおり (各文字 + スペース + 1 つの改行) の結果が得られます。\n\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

文字列メソッドのscan詳細については、 http://ruby-doc.org/core-2.2.0/String.html#method-i-scanを参照してください。

regexp の詳細については、http://rubular.com/で少し試すことができます。

于 2016-05-12T18:37:10.907 に答える