1. Какова цель валидаций в Rails?
Сохранение в базе данных только допустимых данных.
2. Какие имеются способы валидации данных перед их сохранением в базе данных?
Ограничения базы данных/хранимые процедуры — с ними механизмы валидации становятся зависимыми от базы данных, тестирование и сопровождение усложняются. Но, если база данных используется другими приложениями, неплохо было бы применить ограничения на уровне базы данных.
Валидации на стороне клиента приходятся кстати, но обычно ненадежны, если используются одни. Если реализованы с JavaScript, их можно обойти: отключить JavaScript в браузере пользователя. Клиентская валидация — удобный способ мгновенной обратной связи для пользователей сайта.
Валидации на уровне контроллера интересны в использовании, но часто становятся громоздкими и сложными в тестировании и сопровождении. Рекомендуется по возможности не усложнять контроллеры, так с приложением будет приятно работать вдолгую.
3. Почему валидации на уровне модели оптимальны для приложения Rails?
Они не зависят от базы данных, удобны в тестировании и сопровождении, конечным пользователям их не обойти.
4. Как проверить, сохранен ли объект в базе данных?
user = User.new
user.new_record #=> true
user.save #=> true
user.persisted? #=> true
5. Имеется ли способ пропустить валидации?
# Добавить аргумент в метод «save»
user.save(validate: false)
# Или применить методы, которыми не активируются валидации. Например:
user.update_attribute(:name, 'John')
user.touch
User.update_all(status: :active)
6. Как проверить, допустим объект или недопустим?
user.valid? #=> true
user.invalid? #=> false
7. Зачем проверять ассоциацию напрямую, а не просто наличие столбца идентификатора?
Чтобы убедиться в наличии ассоциации, нужно проверить, имеется ли сам связанный объект, а не внешний ключ для сопоставления ассоциации. Так проверяется не только то, что внешний ключ не пуст, но и наличие объекта, на который ссылаются.
8. Почему не нужно проверять наличие ассоциации на обоих концах ассоциации?
Используя метод validates_associated
на обоих концах ассоциаций, они вызывают друг друга в бесконечном цикле.
9. Какова цель метода .validates_with?
Этим методом запись передается в отдельный класс для валидации:
class GoodnessValidator < ActiveModel::Validator
def validate(record)
if record.first_name == "Evil"
record.errors.add :base, "This person is evil"
end
end
end
class Person < ApplicationRecord
validates_with GoodnessValidator
end
10. Как настроить и применить валидацию, выполняемую только в пользовательском контексте?
class Person < ApplicationRecord
validates :email, uniqueness: true, on: :account_setup
end
# Нужно предоставить явный контекст
person = Person.new(email: '[email protected]')
person.valid? #=> true
person.valid?(:account_setup) #=> false
# В «save»
person.save(context: :account_setup)
11. Чем в Active Record отличается validates от validate?
validates
— это метод для обычных валидаций, а validate
применяется для определения пользовательских методов валидации.
12. Как в Rails создается пользовательская валидация?
class User < ApplicationRecord
validate :email_must_be_valid
private
def email_must_be_valid
errors.add(:email, "is invalid") unless email.match?(URI::MailTo::EMAIL_REGEXP)
end
end
13. Как сделать так, чтобы перед сохранением записи поле всегда было в наличии?
class User < ApplicationRecord
validates :email, presence: true
end
14. Как проверить уникальность поля в модели Rails?
class User < ApplicationRecord
validates :email, uniqueness: true
end
Читайте также:
- Будущее Ruby on Rails в эпоху искусственного интеллекта
- Продвинутое применение «select» в Ruby
- Подробный разбор методов Ruby
Читайте нас в Telegram, VK и Дзен
Перевод статьи rubyhub.io: 14 Ruby on Rails Validation interview questions you should know