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

fin*_*lir 9 ruby-on-rails

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

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)

Jon*_*sen 5

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

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


Dar*_*evo 5

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

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

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