Rails,验证输入字段的最大长度

时间:2012-11-21 15:43:34

标签: ruby-on-rails

我有一个评论模型,我限制评论的最大长度,如:

validates_length_of :comment, :maximum => 500

在我看来,我声明了输入字段:

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

输入字段的限制按预期工作,它限制为最多500个字符。

但是,模型限制无法按预期工作。带有换行符的500个字符的文本会给出验证错误。该模型将换行计为两个字符(也可能是其他字符)。所以

此输入有效,无新内容:

 abc abc abc abc....

这不会:

abc

abc
.
.

是否有一种简单的方法可以使validates_length_of将换行符(和其他符号)计为一个字符?

===结果1 ===

我结合了Jon和Dario的精彩答案并创造了这个:

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

3 个答案:

答案 0 :(得分:4)

浏览器从textareas发送换行符为“\ r \ n” 使用Rails默认长度验证器

时,每个换行都会被计为两个字符

因此,要么在控制器中创建替换方法,要么创建自定义长度验证器。

答案 1 :(得分:4)

您可以使用长度验证器的tokenizer选项,仅计算单词,而不是换行符。

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

有关详细信息,请查看此处:Active Record Validations and Callbacks

答案 2 :(得分:1)

您可以使用

ng-class="{'label-danger': (todayDate | unixDate) - (emp.dateHire | unixDate) > 86400000 * 3}"

通过这种方式,您可以获得预期的字符串大小。

此textarea输入:

  

这是一个带

的字符串      

换行

导致此字符串

  

&#34;这是一个带\ r \ na换行符#34;

的字符串

默认情况下,rails验证器会对每个字符进行计数,并获得36的长度

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

如果你使用带有正则表达式"This is a string with \r\na line break".length => 36 的标记生成器,你会得到35的结果(每个字符+空格+ 1个换行符),因为它会删除/./但计算{{1相反。

\n

有关字符串方法\r的详细信息,请参阅http://ruby-doc.org/core-2.2.0/String.html#method-i-scan

有关正则表达式的更多信息,您可以使用http://rubular.com/

进行一些操作