RSpec与多个Rails验证助手崩溃

时间:2013-04-17 18:06:16

标签: ruby-on-rails ruby rspec ruby-on-rails-3.2 guard

我对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验证源复制它并且它有效,抱歉有问题。

1 个答案:

答案 0 :(得分: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

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