我有一个评论模型,我限制评论的最大长度,如:
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
答案 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/
进行一些操作