0

我的 Customer 模型上的 :website 属性有两种不同的验证。一个是内置长度助手,最大值设置为 255,而另一个是自定义验证。它们都单独工作,并且适当的测试通过了,但是由于某种原因,当我使用两个验证运行我的测试时,RSpec 崩溃到我必须完成退出 Guard 并重新启动它的地步。

这是我的代码,它们之间有什么冲突吗?我以前从未经历过这种情况:

class Customer < Active Record::Base

  ...

  URL_REGEX = /(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&amp;'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i

  validates :website, length: { maximum: 255 }
  validate :valid_urls

  private
    def valid_urls
      ["website", "blog", "contact"].each do |attribute|
        errors.add(attribute, "needs to be a valid url") if send(attribute).present? && URL_REGEX.match(send(attribute)).nil?
      end
    end
end

更新:感谢您的帮助,原来整个问题只是一个糟糕的正则表达式。我从 stackoverflow 线程中复制了正则表达式,该线程已经逃脱了一些&符号,产生了一个错误的正则表达式。我刚刚从 jQuery 验证源中复制了它,它工作正常,很抱歉给您带来麻烦。

4

1 回答 1

1

Mackshkatz,您可以尝试删除自定义验证以使用 rails 提供的验证吗?像这样:

class Customer < ActiveRecord::Base
  validates :website, format: { with: URL_REGEX }, allow_blank: true, length: { maximum: 255 }
  validates :blog,    format: { with: URL_REGEX }, allow_blank: true
  validates :contact, format: { with: URL_REGEX }, allow_blank: true
end

看看它是否通过?似乎问题可能出在您使用的复杂正则表达式中。

于 2013-04-17T18:36:06.073 回答