如何使用Rails验证限制行/文本行的数量?

时间:2017-03-24 20:52:22

标签: ruby-on-rails ruby

有没有办法限制Rails中text类型属性中的行/文本行数?

我知道我可以限制像这样的字符数:

validates :message, :length => { :maximum => 100 }

但是行数怎么样?

感谢您的帮助。

3 个答案:

答案 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