有没有办法限制Rails中text
类型属性中的行/文本行数?
我知道我可以限制像这样的字符数:
validates :message, :length => { :maximum => 100 }
但是行数怎么样?
感谢您的帮助。
答案 0 :(得分:4)
您可以创建自定义验证程序以实现所需的逻辑。以下想法应该做的事情:
class LinesValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
lines = value.split("\n")
if lines.size > options[:maximum]
record.errors[attribute] << "too many lines"
end
if lines.any? { |l| l.size > options[:length]}
record.errors[attribute] << "line longer than allowed length"
end
end
end
用法如下:
validates :message, lines: { maximum: 5, length: 10}
有关验证和自定义验证程序的详细信息,请参阅rails docs
答案 1 :(得分:3)
编写自定义验证来完成此操作非常简单。您使用validate
(而不是validates
)来执行此操作:
validate :not_too_many_lines
private
def not_too_many_lines
if self.message.split("\n").length > 10
self.errors.add :message, "has too many lines"
end
end
在幕后,它会在valid?
之前运行,它会检查errors
是否包含任何内容。如果您在尝试保存无效记录后再运行<record>.errors.full_messages
,则会看到“消息包含太多行”。如果您只是想说“太多行”,可以使用self.errors.add :base, "too many lines"
答案 2 :(得分:1)
我无法发表评论。
因此,首先添加答案,split('\ n')并不总是安全的。
最好只使用String#lines
这里是使用lines
方法的示例。
validate :not_too_many_lines
private
def not_too_many_lines
if self.message.lines.count > 10
errors.add :message, "has too many lines"
end
end