Stand der Schienen 6:
Das funktioniert:
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
funktioniert nicht: https://github.com/rails/rails/issues/32376
Da Rails 5 throw(:abort)
erforderlich ist, um die Ausführung abzubrechen: https://makandracards.com/makandra/20301-cancelling-the-activerecord-callback-chain
prepend: true
ist erforderlich, damit dependent: :destroy
es nicht ausgeführt wird, bevor die Validierungen ausgeführt werden: https://github.com/rails/rails/issues/3458
Sie können dies zusammen aus anderen Antworten und Kommentaren fischen, aber ich fand keine von ihnen vollständig.
Als Nebenbemerkung verwendeten viele eine has_many
Beziehung als Beispiel, in der sie sicherstellen möchten, dass keine Datensätze gelöscht werden, wenn verwaiste Datensätze erstellt werden. Dies kann viel einfacher gelöst werden:
has_many :entities, dependent: :restrict_with_error