2017-04-27 7 views
1

phoneフィールドがあるかどうかによって、電子メールをオプションにすることができます。そのようなものがある場合は、存在を確認しないでください。ここでは、コードがあります:別のフィールドの存在に基づいて条件付きで電子メールを要求し、検証する

# model.rb 
validates :email, length: {maximum: 255}, 
     uniqueness: {case_sensitive: false}, 
     email: true 

validates_presence_of :email, unless: Proc.new {|user| user.phone? } 

問題は、ユーザーが空emailフィールドを送信する場合、それはEmail has already been takenEmail is not an emailでエラーになり、これはある方法です。

私もemail_validator.rbています

class EmailValidator < ActiveModel::EachValidator 
    def validate_each(record, attr_name, value) 
    unless value =~ MY_EMAIL_REGEX 
     record.errors.add(attr_name, 'is not an email') 
    end 
    end 
end 

私がしたい:一部の値が入力

  • である場合にのみ

    • 検証、電子メールの形式は、時に空白(または)nilを許可します電子メールは必要ありません(電話機など)
  • 答えて

    1

    0を使用していますemailの1回の検証ではなく、他の検証で、両方に使用します。

    validates :email, length: {maximum: 255}, 
         uniqueness: {case_sensitive: false}, 
         allow_blank: true, # This option will let validation pass if the attribute's value is blank?, like nil or an empty string 
         email: true, unless: Proc.new {|user| user.phone? } 
    
    validates_presence_of :email, unless: Proc.new {|user| user.phone? } 
    

    あなたは、このように両方の検証をマージすることができます。

    validates :email, length: {maximum: 255}, 
          uniqueness: {case_sensitive: false}, 
          presence: true, 
          allow_blank: true, # This option will let validation pass if the attribute's value is blank?, like nil or an empty string 
          email: true, unless: Proc.new {|user| user.phone? } 
    
    +0

    ありがとう!しかし、この場合は空白の電子メールを許可し、電子メールなしで登録する2番目のユーザは、 'index_users_on_email'というキーに対して「重複エントリ」を取得します。 – abpetkov

    +0

    @abpetkov: allow_blankの詳細:http://guides.rubyonrails.org/active_record_validations.html#allow-blank –

    +0

    空白と空白を許可する場合でも、私は 'Duplicate entry'エラーを受け取ります。 – abpetkov

    関連する問題