【发布时间】:2013-04-17 18:06:15
【问题描述】:
我的 Customer 模型上的 :website 属性有两种不同的验证。一个是内置长度助手,最大值设置为 255,而另一个是自定义验证。它们都单独工作,并且适当的测试通过了,但是由于某种原因,当我使用两个验证运行测试时,RSpec 崩溃到我必须完成退出 Guard 并重新启动它。
这是我的代码,它们之间有什么冲突吗?我以前从未经历过:
class Customer < Active Record::Base
...
URL_REGEX = /(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\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})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/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 验证源中复制了它,它工作正常,很抱歉。
【问题讨论】:
-
需要更多信息。你使用的是什么 ruby/rails/rspec/guard 版本?您可以粘贴崩溃回溯(pastie.org 会很好)吗?关闭防护运行规范的结果是什么?
-
嘿gmile。 ruby 1.9.2p290 // rails 3.2.11 // rspec 2.11.1 // 守卫 0.8.8。不幸的是,我没有得到回溯,它只是停止运行,直到我取消。我只是在关闭防护的情况下运行它,并且发生了完全相同的行为。一旦它通过我的测试,涉及建立一个指定网站的客户,它就会停止在它的轨道上。
-
mackshkatz,您可以尝试在没有保护的情况下运行测试,看看它是否有效?只需
rspec spec/path/to/my_spec.rb -
gmile,对不起,我就是这个意思。我用 rspec 运行它,所以看来 Guard 根本不参与这个问题。
标签: ruby-on-rails ruby rspec ruby-on-rails-3.2 guard