Ведём разработку плагина для 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 - не нашёл решения.