2012-03-20 9 views
0

ローカルシステムで正しく動作するモデルバリデーションを持つフォームがありますが、ライブサイトでチェックすると、モデルのバリデーションオーダーの順序は変更されますが、コードは同じですどちらも。 Ruby on Railsカスタムモデルバリデーションの注文を変更する

この

は、モデル内のコードのブロックです:

def validate 

    #email validation 
    if !email.blank? 
     #errors.add(:email,I18n.t(:ismissing)) 
     #else 
     if email != email_confirmation 
     errors.add(:email,I18n.t(:ErrorMessageConfirmEmailNotmatch)) 

     else 
     if email.length <=200 then 
      if email.match(/^[^@][\w.-]*@[\w.-]+[.][a-z]{2,4}$/i).nil? 
      errors.add(:email,I18n.t(:ErrorMessageInvalid)) 
      else 

      if @new_record==true 
       if User.find(:all, :conditions => ['lower(email) = ?', email.downcase]).count>0 
       #errors.add(:email," ID already exists. Provide another Email ID") 
       errors.add(:email,I18n.t(:ErrorMessageAlreadyExists)) 
       end 
      else 
       if @changed_attributes["email"]!=nil 
       if User.User.find(:all, :conditions => ['lower(email) = ?', email.downcase]).count>0 
        #errors.add(:email," ID already exists. Provide another Email ID") 
        errors.add(:email,I18n.t(:ErrorMessageAlreadyExists)) 
       end 
       end 
      end 


      end 
     else 
      errors.add(:email, I18n.t(:ErroeMessageMustlessthen,:size=>200)) 
     end 
     end 
    else 
     errors.add(:email,I18n.t(:ismissing)) 
    end 
    #end : Email validation 

    if email_confirmation.blank? 
     errors.add(:email_confirmation,I18n.t(:ismissing)) 
    end 

    #pasword validation 
    if @new_record==true 
     if password.blank? 
     errors.add(:password,I18n.t(:ismissing)) 
     else 
     if password_confirmation != password 
      errors.add(:password,I18n.t(:ErrorMessageConfirmPasswordNotmatch)) 
     end 
     if !password.nil? 
      if password.length < 4 || password.length > 50 then 
      errors.add(:password,I18n.t(:ErroeMessageShouldBetween,:from=>"4",:to=>"50")) 

      end 
      errors.add(:password,I18n.t(:ErrorMessageInvalidPassword)) if password.match('^[[email protected]#*-_]*$').nil? 
     end 
     end 
    end 
    #end password validation 

    if @new_record==true 
    if password_confirmation.blank? 
     errors.add(:password_confirmation,I18n.t(:ismissing)) 
    end 
    end 

    if dob.blank? 
     errors.add(:dob,I18n.t(:ErrorMessageInvalid)) 
    else 
     begin 
     #dt = DateTime.strptime(dob, "%m/%d/%Y").to_date 
     if dob.year <= 1900 then 
      errors.add(:dob,I18n.t(:ErrorMessageInvalidYear)) 
     end 
     if dob>=Date.today then 
      errors.add(:dob,I18n.t(:ErroeMessageInvalidBirthday)) 
     end 

     rescue Exception => ex 
     #errors.add(:dob,'is Invalid (MM/DD/YYYY format)') 
     errors.add(:dob,I18n.t(:ErroeMessageInvalidBirthday)) 
     end 
    end 

    end 

と誰もが任意の提案やアイデアを持っている場合、コントローラが必要ですregistration.An緊急援助のValidateメソッドを呼び出します。 ありがとうございます

+0

あなたはデフォルトのレールバリデーションを使用できませんか?なぜ自分のものが必要なのですか?あなたはデフォルトのレールバリデーションを使用していてもカスタムエラーメッセージを送ることができます... – klump

+0

ルビーコアを引用してみましょう: '#テストを確実にする必要があるときは、それでは、あなたが吸うとテストが弱いことを認めています。 ' 'def self.i_suck_and_my_tests_are_order_dependent!' – Reactormonk

+0

@klump:生年月日と電子メールと電話番号のデフォルト検証を使用する方法:正規表現カスタムを提供する必要があります...もしあなたが私はそれらを使用する方法を説明してくださいできません? – nidhi

答えて

0

なぜこれらが順番に実行されないのか分かりません。あなたはプロダクションでそれを示すために何かを記録しましたか?

すべてを大規模な検証メソッドに入れるのではなく、いくつかの方法(おそらく一般的にはより良い方法)に分割し、必要な順序で呼び出します。

例えば、

before_save :validate_email, :validate_dob 


def validate_email 
... 
end 

def validate_dob 
... 
end 
+0

こんにちはKevin ...私はそれらを分割する場合、検証は発砲しません – nidhi

2

デフォルトvalidations..Iは、電子メールのためにしたと、ここで、あなたにサンプルを与えたレールを使用することができます。..

validates :email, 
     :presence =>{ :message => I18n.t(:ismissing)}, 
     :length => {:allow_blank => true, :maximum => 200, :message => I18n.t(:ErroeMessageMustlessthen,:size=>200)}, 
     :format => {:allow_blank => true, :with => /^[^@][\w.-]*@[\w.-]+[.][a-z]{2,4}$/i, :message => I18n.t(:ErrorMess 
     :uniqueness => {:allow_blank => true, :message => I18n.t(:ErrorMessageAlreadyExists)}, 
     :confirmation => {:message => I18n.t(:ErrorMessageConfirmEmailNotmatch)} 

同様に、あなたはまた、他の分野のために行うことができます。

+0

こんにちはStalin:それらが表示されている順序はまだ複数のフィールドの検証を入れています... – nidhi

関連する問題