Ruby on Rails更改自定义模型验证的顺序

时间:2012-03-20 06:25:53

标签: ruby-on-rails validation model

我有一个模型验证的表单在我的本地系统中正常工作但是当我在实际站点上检查时,模型验证顺序的顺序会发生变化,尽管两者中的代码相同。

这是模型中的代码块:

 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('^[a-z0-9@#*-_]*$').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

并且控制器在注册时调用Validate方法。如果有人有任何建议或想法,则需要紧急帮助。 在此先感谢

2 个答案:

答案 0 :(得分:2)

你可以使用rails默认验证..我为电子邮件做了,并在这里给你样品..
   

 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)}

同样,您也可以为其他领域做。

答案 1 :(得分:0)

不确定为什么这些不会按顺序执行。你有记录在生产中的东西吗?

不是将所有内容放在一个大的验证方法中,而是分成几个(一般来说可能是更好的实践),然后按照你想要的顺序调用。

例如

before_save :validate_email, :validate_dob


def validate_email
...
end

def validate_dob
...
end