#ruby-on-rails #validation
#ruby-on-rails #проверка
Вопрос:
как могут быть разные проверки в зависимости от действия?
validates :total_pressed,
:numericality => { :on => :create, :greater_than => 0 },
:numericality => { :on => :update, :greater_than_or_equal_to => 100 }
первое числовое утверждение игнорируется
Ответ №1:
Вы можете использовать validate_on_create и validate_on_update
def validate_on_create # is only run the first time a new object is saved
errors.add(:total_pressed, 'invalid number') if total_pressed < 0
end
def validate_on_update
errors.add(:total_pressed, 'invalid number') if total_pressed < 100
end
Ответ №2:
При проверке первого оператора numericality игнорируется, потому что это хэш, и одна вещь перезаписывает другую
Вы можете сделать это:
validates :total_pressed, :numericality => { :on => :create, :greater_than => 0 }
validates :total_pressed, :numericality => { :on => :update, :greater_than_or_equal_to => 100 }
Ответ №3:
Обычно проверка выполняется как при создании, так и при обновлении (через save), поэтому, если вы передадите флаг on, вы ограничите его любым из двух методов. Если вы хотите иметь другую проверку на основе действия, то вам лучше всего использовать пользовательскую проверку.
то есть
validate :total_pressed_on_create, :total_pressed_on_update
def total_pressed_on_create
errors.add(:total_pressed, 'invalid number') if self < 0 and self.new_record?
end
def total_pressed_on_update
errors.add(:total_pressed, 'invalid number') if self < 100 and !self.new_record?
end
Что-то в этом роде. Для получения более подробной информации ознакомьтесь с Rails Guide: Validation.