9

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

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
4

3 回答 3

5

浏览器从 textareas 发送换行符为 "\r\n" 当使用 Rails 默认长度验证器时,每个换行符都被计为两个字符

所以要么在控制器中创建一个替换方法,要么创建一个自定义长度验证器。

于 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\na 换行符的字符串"

默认情况下,rails 验证器计算每个字符并获得 36 的长度

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

如果您将标记器与正则表达式一起使用,/./您会得到 35 的结果,正如您所期望的(每个字符 + 空格 + 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

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

于 2016-05-12T18:37:10.907 回答