在我的模型中,我添加了以下代码,用于验证用户可以输入的URL:
validates :website, presence: true
validates :website, format: { with: URI.regexp }, if: 'website.present?'
我用无效的网址编写了一个测试:
http://example,nl
当我运行测试时,验证表明这是一个有效的输入。我已经在程序中尝试了它,这是一个可接受的URI。有没有办法设置URI.regex所以这是一个无效的URL?
答案 0 :(得分:1)
URI.regexp返回一个匹配所有有效URI的URI,但是a)它不验证该字符串仅该URI,以及b)您要验证URL,而不是URI (URI是更广泛的术语)。
对于a),只有当字符串只是URI时,才能修改正则表达式,方法是将其包装在^
(行首)和$
中(结束时)线)符号:
validates :website, format: { with: /^#{URI.regexp.to_s}$/ }, if: 'website.present?'
对于b),您可以将呼叫更改为URI.regexp(['http', 'https'])
以限制允许的方案,从而使您更接近。这个问题也有宝石,比如valid_url。或者,接受您的验证永远不会是完美的。