如何在rails模型中验证url?

时间:2016-01-01 23:25:47

标签: ruby-on-rails ruby validation url

我有url模型有url列,我想验证该列是一个有效的URL,我试过这个:

class User < ActiveRecord::Base
    validates_format_of :url, :with => URI::regexp(%w(http https))
end

但是当我输入这个网址时:http://ruby3arabi它接受它,有什么想法吗?

4 个答案:

答案 0 :(得分:9)

我测试过并发现 URI :: regexp(%w(http https)) URI :: regexp 不够好。

故障排除正在使用此正则表达式

<(?:Jan|Feb|Mar|Apr|May|June|July|Aug|Sept|Oct|Nov|Dec)\s\d\d?.+?\d\d\d\d\s\b(?:1[0-2]|0?[1-9]):[0-5][0-9]:[0-5][0-9]\s[AaPp][Mm]\sSGT>\s(<\w+>)

选项:

  • i - 不区分大小写
  • x - 忽略正则表达式中的空格

因此,如果您想在模型中进行验证,则应使用此代码:

/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix

测试:

  • [1] URI :: regexp(%w(http https))

    使用错误的网址进行测试:

    • http:// ruby​​3arabi - 结果无效
    • http:// http://ruby3arabi.com - 结果无效
    • http:// - 结果无效

    使用正确的网址进行测试:

    • http://ruby3arabi.com - 结果无效
    • http://www.ruby3arabi.com - 结果无效
    • https://www.ruby3arabi.com - 结果无效
    • https://www.ruby3arabi.com/article/1 - 结果无效
    • https://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en - 结果无效

  • [2] URI :: regexp

    使用错误的网址进行测试:

    • http:// ruby​​3arabi - 结果有效
    • http:// http://ruby3arabi.com - 结果有效
    • http:// - 结果有效

    使用正确的网址进行测试:

    • http://ruby3arabi.com - 结果有效
    • http://www.ruby3arabi.com - 结果有效
    • https://www.ruby3arabi.com - 结果有效
    • https://www.ruby3arabi.com/article/1 - 结果有效
    • https://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en - 结果有效

  • [3] /^(http|https)://[a-z0-9]+([-.]{1}[a-z0-9]+) [AZ] {2,5-}。(:[0-9] {1,5})?(/ )$ / IX

    使用错误的网址进行测试:

    • http:// ruby​​3arabi - 结果无效
    • http:// http://ruby3arabi.com - 结果无效
    • http:// - 结果无效

    使用正确的网址进行测试:

    • http://ruby3arabi.com - 结果有效
    • http://www.ruby3arabi.com - 结果有效
    • https://www.ruby3arabi.com - 结果有效
    • https://www.ruby3arabi.com/article/1 - 结果有效
    • https://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en - 结果有效

答案 1 :(得分:4)

我用这个gem https://github.com/ralovets/valid_url

解决了这个问题

答案 2 :(得分:1)

此处有另一个宝石选项:validates_url

答案 3 :(得分:0)