我有一个评论模型,我限制评论的最大长度,如:
validates_length_of :comment, :maximum => 500
Run Code Online (Sandbox Code Playgroud)
在我看来,我声明了输入字段:
<%= f.text_area :comment,:as => :text, :maxlength => 500 %>
Run Code Online (Sandbox Code Playgroud)
输入字段的限制按预期工作,它限制为最多500个字符.
但是,模型限制不能按预期工作.带有换行符的500个字符的文本会给出验证错误.该模型将换行计为两个字符(也可能是其他字符).所以
此输入将起作用,没有换行符:
abc abc abc abc....
Run Code Online (Sandbox Code Playgroud)
这不会:
abc
abc
.
.
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以使validates_length_of将换行符(和其他符号)计为一个字符?
===结果1 ===
我结合了Jon和Dario的精彩答案并创造了这个:
before_validation(:on => :create) do
self.comment = comment.gsub("\r\n","\n") if self.comment
end
Run Code Online (Sandbox Code Playgroud)
浏览器将 textareas 中的换行符发送为 "\r\n" 当使用 Rails 默认长度验证器时,每个换行符都被算作两个字符
因此,要么在控制器中创建一个替换方法,要么创建一个自定义长度验证器。
您可以使用长度验证器的标记器选项,只计算单词,而不是换行符。
validates :comment, length: {
maximum: 500,
tokenizer: lambda { |str| str.scan(/\w+/) }
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请查看此处:Active Record Validations and Callbacks