Положение дел в Rails 6:
Это работает:
before_destroy :ensure_something, prepend: true do
throw(:abort) if errors.present?
end
private
def ensure_something
errors.add(:field, "This isn't a good idea..") if something_bad
end
validate :validate_test, on: :destroy
не работает: https://github.com/rails/rails/issues/32376
Поскольку throw(:abort)
для отмены выполнения требуется Rails 5 : https://makandracards.com/makandra/20301-cancelling-the-activerecord-callback-chain
prepend: true
требуется, чтобы dependent: :destroy
он не запускался до выполнения проверки: https://github.com/rails/rails/issues/3458
Вы можете выудить это вместе из других ответов и комментариев, но я не нашел ни одного из них полным.
В качестве дополнительной заметки многие использовали has_many
отношение в качестве примера, в котором они хотят убедиться, что не удаляют какие-либо записи, если это приведет к созданию потерянных записей. Решить эту проблему гораздо проще:
has_many :entities, dependent: :restrict_with_error