Как остановить другие проверки для проверки, когда атрибут не :present в Rails?

В настоящее время я делаю следующее:

validates :new_pass,
          :presence => {:if => :new_record?},
          :confirmation => {:if => :password_not_blank?},
          :length => {:within => 6...64, :if => :password_not_blank?}

def password_not_blank?
  !new_pass.blank?
end

Но это не DRY, держу пари, есть способ пропустить проверки, если атрибут отсутствует.

Кроме того, нет никакого метода DSL для проверки? Я думаю, что это было бы чище, чем реализация логики внутри хэшей...

-- Редактировать, спасибо ^^ --

Это то, что я получил сейчас:

validates :new_pass,
          :allow_blank => {:on => :update},
          :presence => {:on => :create},
          :confirmation => true,
          :length => {:within => 6...64}

И просто для записи, и чтобы никто не беспокоился (?), это виртуальный атрибут, фактический пароль зашифрован с помощью before_save, проверяя, что :new_pass не является пустым.


person Zequez    schedule 26.08.2011    source источник


Ответы (1)


Флаг :allow_nil для validates может представлять интерес. . Что-то вроде этого должно работать:

validates :new_pass,
          :allow_nil => true,
          :presence => {:if => :new_record?},
          :confirmation => {:if => :password_not_blank?},
          :length => {:within => 6...64, :if => :password_not_blank?}
person mu is too short    schedule 26.08.2011
comment
Спасибо! Я думаю, что мне нужно было :allow_blank, так как :new_pass может быть установлен на пустую строку. Кроме того, мне не понадобится :if - person Zequez; 26.08.2011
comment
@Zequez: я выбрал :allow_nil из-за наличия :X_not_blank? опций, но вы разобрались, так что у нас все хорошо. - person mu is too short; 26.08.2011