【问题标题】:Rails Validation that use validates a string with a regex?Rails Validation 使用正则表达式验证字符串?
【发布时间】:2011-09-01 03:23:59
【问题描述】:

我有一个 Message.uuid 字段,我想为其添加验证,其中包括:

支持:

  • A-Z、a-z、0-9
  • 中间有破折号,但从不以破折号开头或结尾。
  • 至少 5 个,不超过 500 个字符

在 Rails 中为这些规则编写模型验证的最佳方法是什么?

谢谢

更新:

  validates :uuid,
    :length => { :within => 5..500 },
    :format => { :with => /[A-Za-z\d][-A-Za-z\d]{3,498}[A-Za-z\d]/ }

使用有效的 UUID 失败

【问题讨论】:

  • 你需要将你的正则表达式锚定在^$之间,否则"@%#@#$AAAAA@#%@#$"之类的东西会通过。
  • 你还应该限制你的format验证器的范围;您当前尝试验证长度两次,而像 AAA 这样的 UUID 将导致两个错误:一个关于长度,一个关于格式。您可能只希望它导致 length 错误。

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

我会将长度验证留给validates_length_of 验证器,以便您获得更具体的错误消息。这将为您做两件事:简化与 validates_format_of 验证器一起使用的正则表达式,并在 uuid 太短/太长时提供特定于长度的错误消息,而不是将长度错误显示为“格式”错误。

尝试以下方法:

validates_length_of :uuid, :within => 5..500
validates_format_of :uuid, :with => /^[a-z0-9]+[-a-z0-9]*[a-z0-9]+$/i

您可以使用 Rails 3 将两个验证合并为一个 validates

validates :uuid,
    :length => { :within => 5..500 },
    :format => { :with => /^[a-z0-9][-a-z0-9]*[a-z0-9]$/i }

【讨论】:

  • 你是不是错过了这里的大写字母?
  • @Benoit 我是,简单地说,但记得 /i 忽略大小写的正则表达式。
  • 刚刚尝试过,但它似乎不起作用,它一直在重定向。我已经粘贴了我在上面使用的代码。想法?
  • 即使只使用 validates_length_of 输入 123412 也会导致重定向
  • @ColdTree 验证器不会导致重定向。 模型甚至不会导致重定向。无论您遇到什么问题,都与您的模型无关。尝试运行 rails console 并创建一个带有无效 UUID 的 Message,并检查它有哪些错误。
【解决方案2】:

用途:

validates :uuid, :format => {:with => /my regexp/}

至于正则表达式,您已经在another question 中询问过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多