alexsobolenko
@alexsobolenko
Программист

Почему сохраняется часть данных, если есть сообщение об ошибке?

Ведём разработку плагина для redmine. Столкнулись с проблемой, что при сохранении изменений issue часть внесённых изменений сохраняется, несмотря на сообщение об ошибке.

В патче были добавлены новые поля. `block_reason` - причина блокировки, простая текстовая строка
`block_types` - типы блокировки, связь many-to-many с другой сущностью, реализованная с помощью `has_and_belongs_to_many`. Для валидации ипользуется кастомный метод:
def check_for_block_type
    errors.add(:block_type, l('activerecord.errors.messages.empty')) if block_reason.present? && !block_type_ids.count.positive?
    errors.add(:block_reason, l('activerecord.errors.messages.empty')) if !block_reason.present? && block_type_ids.count.positive?
end

Если в форме выбрать тип блокировки и не указать её причину, то мы получаем сообщение, что причина блокировки не указана, как и должно быть, но при этом тип блокировки всё равно сохраняется. В таблице в БД появляется соответствующая запись, и, если открыть issue, например, в новой вкладке, то мы видим указанный тип блокировки и не указанную причину. Как сделать, чтобы не сохранялись типы, если не указана блокировка? Перечитал документацию rails по связям many-to-many - не нашёл решения.
  • Вопрос задан
  • 38 просмотров
Пригласить эксперта
Ответы на вопрос 1
1.
Вместо
!block_type_ids.count.positive?
лучше
block_type_ids.empty?
И напротив, вместо .empty? использовать .present?

2. проверить, что колбэк валидации срабатывает, поставив точку останова и протрассировать. Убедиться, что модель действительно возвращает false на .valid?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы