web-dev-qa-db-ja.com

空でない場合にのみメール形式を検証するRails 3

メールが入力された場合にのみ、メールを検証します。

私は次を試しました:

validates :email, :presence => {:message => "Your email is used to save your greeting."},
                  :email => true,
                  :if => Proc.new {|c| not c.email.blank?},
                  :uniqueness => { :case_sensitive => false }

ただし、電子メールが空白のままの場合はエラーメッセージが表示されないため、これは機能しません。

不足している電子メールの存在を検証し、入力された形式のみを検証するにはどうすればよいですか?

46
chell

これでうまくいくはずです。

validates :email,:presence => {:message => "Your email is used to save your greeting."}, :allow_blank => true,:uniqueness => { :case_sensitive => false } 

使用する:allow_blank => trueまたは:allow_nil => true, :if => :email?

編集:タイプミスを修正。

79
Abhaya

カスタム検証関数を作成できます。

class Model < ActiveRecord::Base
  validate :check_email

  protected
  def check_email
    if email.blank?
      validates :email, :presence => {:message => "Your email is used to save your greeting."}
    else
      validates :email,
        :email => true,
        :uniqueness => { :case_sensitive => false }      
    end
  end
end

または、バリデーターを条件付きの2つの別個のバリデーターに分割します。

validates :email, 
  :presence => {:message => "Your email is used to save your greeting."}, 
  :if => Proc.new {|c| c.email.blank?}

validates :email, 
  :email => true,
  :uniqueness => { :case_sensitive => false }
  :unless => Proc.new {|c| c.email.blank?}
7
Hck

精度が不要な場合はフォーマットを検証できます:allow_nil => true

1
Rolando