2012-11-21 57 views
8

我有一个注释模型,其中我限制像注释的最大长度:轨,验证输入字段的最大长度

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

我结合乔恩和达里奥伟大的答案,并创造了这个:

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

回答

4

浏览器发送换行文本域,从为 “\ r \ n” 个 每个有效使用Rails默认长度验证程序时,换行符被计为两个字符。

因此,无论是在控制器中创建替换方法,还是创建自定义长度验证程序。

4

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

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(/./) } 
} 

这样,你得到正是你所期望的字符串大小。

这textarea的输入:

这是

换行符

导致这个字符串

一个字符串“这是一个字符串\ r \ na line break“

每默认轨验证计算每个字符,如果您使用正则表达式的标记者得到的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/