Rails 3. before_destroy Validierung um zu verhindern, dass das löschen übergeordnete Datensätze
Habe ich Sendungen und Rechnungen.
Rechnung gehört zu dem Versand
Sendung hat einen Rechnung
Wenn der Sendung eine Rechnung, dann wird der Versand sollte nicht mehr gelöscht werden. Ich brauche, um diese bis in den Modellen, denn ich bin mit ActiveAdmin.
Also ich habe das in der Sendung.rb
has_one :invoice
before_destroy :check_for_invoice
private
def check_for_invoice
unless invoice.nil?
self.errors[:base] << "Cannot delete shipment while its invoice exists."
end
end
Aber ich bekomme nur eine gelbe Meldung "Sendung kann nicht gelöscht werden," aber es war in der Tat gelöscht.
Wie kann ich verhindern, dass die Sendung gelöscht wird?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
before_destroy
callback muss einen true/false-Wert, um zu bestimmen, ob oder nicht zu fahren Sie bis.Hinzufügen
return false
zu Ihremcheck_for_invoice
etwa so:if invoice.nil?
, es sollunless invoice.nil?
statt.Meine 2 Cent in den Versand.rb
Ich denke, dass es dann funktioniert, sah ich diese Lösung in einem anderen thread. Ich bin tryng jetzt in meine Modelle.
Aus der docs:
Also versuchen Sie dies:
return
ist meist nicht idiomatisch in Ruby, aber was ist, wenn die Zeile nicht die Letzte in der Methode (plus betrachten refactoring)? Oder was ist, wenn Sie später hinzufügen, andere Anweisungen in der Methode und vergessen, fügen Sie die Rückkehr? Ich denke, das sind die Gründe warum Sie das tun, sehenand return false
verwendet in rails-Projekten...Für Rails 4:
wird den trick tun. Wenn Sie möchten, eine Ausnahme statt eines Fehlers verwenden
:restrict_with_exception
. Sehen Sie mehr an die jeweiligen api-docs-Seite.Für Rails 3 (vielleicht auch früher) versuchen: