What is the best/easy way to validate an email address in Ruby?

前端 未结 10 856
刺人心
刺人心 2020-12-13 06:40

What is the best/easy way to validate an email address in ruby (on the server side)?

相关标签:
10条回答
  • 2020-12-13 07:00

    You could look whether or not it matches a regexp like the one used in this Rails validator:

    validates_format_of :email,:with => /\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/
    

    But if you use Devise, simply do:

    validates_format_of :email,:with => Devise::email_regexp
    

    Source: http://lindsaar.net/2008/4/14/tip-4-detecting-a-valid-email-address

    Edit 1:

    useful website for tests: http://www.rubular.com/

    0 讨论(0)
  • 2020-12-13 07:00

    Shortcut Form:

     validates :email, :format => /@/
    

    Normal Form (Regex) :

    validates :email, :format => { :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/ }
    

    Source: Validator Class

    0 讨论(0)
  • 2020-12-13 07:06

    I know that this is a old question but I was looking for a simple to way to do this. I came across a email_validator gem this is really simple to set up and use.

    as a validator

    validates :my_email_attribute, :email => true

    Validation outside a model

    EmailValidator.valid?('narf@example.com') # boolean

    I hope that this help everyone.

    Happy Codding

    0 讨论(0)
  • 2020-12-13 07:06

    Send a confirmation mail , and I will usualy use this validator ... D.R.Y.

    # lib/email_validator.rb
    class EmailValidator < ActiveModel::EachValidator
    
      EmailAddress = begin
        qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
        dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'
        atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-' +
          '\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'
        quoted_pair = '\\x5c[\\x00-\\x7f]'
        domain_literal = "\\x5b(?:#{dtext}|#{quoted_pair})*\\x5d"
        quoted_string = "\\x22(?:#{qtext}|#{quoted_pair})*\\x22"
        domain_ref = atom
        sub_domain = "(?:#{domain_ref}|#{domain_literal})"
        word = "(?:#{atom}|#{quoted_string})"
        domain = "#{sub_domain}(?:\\x2e#{sub_domain})*"
        local_part = "#{word}(?:\\x2e#{word})*"
        addr_spec = "#{local_part}\\x40#{domain}"
        pattern = /\A#{addr_spec}\z/
      end
    
      def validate_each(record, attribute, value)
        unless value =~ EmailAddress
          record.errors[attribute] << (options[:message] || "is not valid") 
        end
      end
    
    end
    

    in your model

    validates :email , :email => true
    

    or

     validates :email, :presence => true, 
                    :length => {:minimum => 3, :maximum => 254},
                    :uniqueness => true,
                    :email => true
    
    0 讨论(0)
提交回复
热议问题