【问题标题】:Rails custom validation based on a regex?基于正则表达式的 Rails 自定义验证?
【发布时间】:2011-12-02 14:32:20
【问题描述】:

我在 routes.rb 中为 /type-in​​-something-here 使用了以下正则表达式

# A-Z, a-z, 0-9, _ in the middle but never starting or ending in a _
# At least 5, no more than 500 characters

在路线中,这很有效:

match ':uuid' => 'room#show', :constraints => { :uuid => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/ }

我也想将此作为验证,因此不会创建无效记录。所以我在 room.rb 中添加了以下内容:

validates_format_of :uuid, :with => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/i, :message => "Invalid! Alphanumerics only."

但是这个 validates_format_of 不起作用,它允许保存记录而不是添加错误。

有什么想法吗?

谢谢

【问题讨论】:

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


    【解决方案1】:

    使用类似的东西

    validates :uuid, :format => {:with => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/i},
                     :message => "your message"
    

    更多请查看this

    【讨论】:

    • 这对我来说效果很好,但是在这个例子中右大括号的位置不正确。应该是:validates :uuid, :format => {:with => /.../i, :message => "..."}
    【解决方案2】:

    出于验证目的,请记住添加字符串标记 \A\Z 的开头和结尾:

    validates_format_of :uuid, :with => /\A[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?\Z/i
    

    否则,您的正则表达式将愉快地匹配任何至少包含一个字母或数字的字符串。出于某种原因,Rails 隐式地在路由中添加了边界。 (可能是因为它将正则表达式嵌入到一个更大的表达式中以匹配整个 URL,并明确检查 / 和 URL 的结尾。)

    【讨论】:

    • 请注意,在正则表达式末尾使用\Z 允许尾随换行符。你可能想要\z。 (对旧问题发表评论表示歉意。)
    【解决方案3】:
    validates :name, format: { with: /\A[a-zA-Z]+\z/,
    message: "Only letters are allowed" }
    

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      相关资源
      最近更新 更多