У меня есть некоторые проверки Active Record на моей модели:
class Product < ApplicationRecord
validates :name, presence: true, length: { is: 10 }
end
Кажется, все в порядке. Он подтверждает, что поле name
не является nil
, ""
и что оно должно содержать ровно 10 символов. Теперь, если я хочу добавить пользовательскую проверку , я бы добавил вызов validate
:
class Product < ApplicationRecord
validates :name, presence: true, length: { is: 10 }
validate :name_must_start_with_abc
private
def name_must_start_with_abc
unless name.start_with?('abc')
self.errors['name'] << 'must start with "abc"'
end
end
end
Проблема в том, что когда поле name
равно nil
, проверка presence_of
его перехватит, но не помешает проверке с помощью пользовательского метода name_must_start_with_abc
, подняв NoMethodError
, как name
равно nil
.
Чтобы преодолеть это, я должен добавить ноль-проверку к методу name_must_start_with_abc
.
def name_must_start_with_abc
return if name.nil?
unless name.start_with?('abc')
self.errors['name'] << 'must start with "abc"'
end
end
Это то, чего я не хочу делать, потому что, если я добавлю больше «зависимых» проверок, мне придется повторно проверять их для каждого пользовательского метода проверки.
Как обрабатывать зависимые проверки на Rails? Есть ли способ предотвратить вызов пользовательской проверки, если другие проверки не прошли?