J'ai un modèle d'URL avec une colonne d'url et je veux valider cette colonne comme une URL valide, j'ai essayé avec ceci:

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

Mais quand j'entre cette URL: http://ruby3arabi c'est l'accepter, des idées?

4
AliOsm 2 janv. 2016 à 02:25

4 réponses

Meilleure réponse

J'ai résolu ce problème avec ce joyau https://github.com/ralovets/valid_url

4
AliOsm 2 janv. 2016 à 22:53

J'ai testé et trouvé que URI :: regexp (% w (http https)) ou URI :: regexp ne sont pas assez bons.

Le dépannage utilise cette expression régulière

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

Option:

  • i - insensible à la casse
  • x - ignore les espaces dans les regex

Donc, si vous souhaitez valider dans le modèle, vous devez utiliser ceci à la place:

class User < ActiveRecord::Base
  URL_REGEXP = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
  validates :url, format: { with: URL_REGEXP, message: 'You provided invalid URL' }
end

Tester:

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

    Tester avec de mauvaises URL:

    • http: // ruby3arabi - le résultat n'est pas valide
    • http: // http: //ruby3arabi.com - le résultat n'est pas valide
    • http: // - le résultat n'est pas valide

    Tester avec les URL correctes:

    • http://ruby3arabi.com - le résultat n'est pas valide
    • http://www.ruby3arabi.com - le résultat n'est pas valide
    • https://www.ruby3arabi.com - le résultat n'est pas valide
    • https://www.ruby3arabi.com/article/1 - le résultat n'est pas valide
    • https://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en - le résultat n'est pas valide

  • [2] URI :: regexp

    Tester avec de mauvaises URL:

    • http: // ruby3arabi - le résultat est valide
    • http: // http: //ruby3arabi.com - le résultat est valide
    • http: // - le résultat est valide

    Tester avec les URL correctes:

    • http://ruby3arabi.com - le résultat est valide
    • http://www.ruby3arabi.com - le résultat est valide
    • https://www.ruby3arabi.com - le résultat est valide
    • https://www.ruby3arabi.com/article/1 - le résultat est valide
    • https://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en - le résultat est valide

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

    Tester avec de mauvaises URL:

    • http: // ruby3arabi - le résultat n'est pas valide
    • http: // http: //ruby3arabi.com - le résultat n'est pas valide
    • http: // - le résultat n'est pas valide

    Tester avec les URL correctes:

    • http://ruby3arabi.com - le résultat est valide
    • http://www.ruby3arabi.com - le résultat est valide
    • https://www.ruby3arabi.com - le résultat est valide
    • https://www.ruby3arabi.com/article/1 - le résultat est valide
    • https://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en - le résultat est valide

10
Komsun K. 7 févr. 2018 à 04:39

Une autre option de gemme ici: validates_url.

2
hoffm 9 nov. 2017 à 18:31

Vous devriez envisager d'utiliser URI.parse: http://ruby-doc.org/stdlib-2.1.1/libdoc/uri/rdoc/URI.html#method-c-parse

1
Tyler Zuver 1 janv. 2016 à 23:32