133 Stimmen

Geländer: Warum löst find(id) in Rails eine Ausnahme aus?

Mögliches Duplikat:
Model.find(1) gibt ActiveRecord-Fehler, wenn id 1 nicht existiert

Wenn es in der Datenbank keinen Benutzer mit der ID 1 gibt, versucht User.find(1) löst eine Ausnahme aus.

Warum ist das so?

237voto

runako Punkte 6082

Denn das ist die Art und Weise, wie die Architekten die Funktion von find(id) beabsichtigt haben, wie in der RDoc angegeben:

Nach ID suchen - Dies kann entweder eine bestimmte ID (1), eine Liste von IDs (1, 5, 6) oder ein Feld von IDs ([5, 6, 10]) sein. Wenn für alle aufgelisteten IDs kein Datensatz gefunden werden kann, wird RecordNotFound ausgelöst.

Wenn Sie nicht wollen, dass die Ausnahme ausgelöst wird, verwenden Sie find_by_id, das nil zurückgibt, wenn es kein Objekt mit der angegebenen ID findet. Ihr Beispiel würde dann lauten User.find_by_id(1) .

-8voto

John Topley Punkte 110122

Nach der Erklärung von runako ist es tatsächlich ziemlich nützlich, die Wahl zu haben, ob eine Ausnahme ausgelöst wird oder nicht. Ich arbeite an einer Blog-Anwendung und wollte Unterstützung für die Anzeige des nächsten oder vorherigen Blogeintrags hinzufügen. Ich konnte zwei Instanzmethoden zu meiner Post Modell, das einfach zurückgibt nil wenn Sie versuchen, den vorherigen Beitrag zu sehen, wenn Sie den ersten Beitrag sehen, oder den nächsten Beitrag, wenn Sie den letzten Beitrag sehen:

def next
  Post.find_by_id(id + 1)
end

def previous
  Post.find_by_id(id - 1)
end

Dadurch wird vermieden, dass mein Hilfscode, der die Links Vorheriger Beitrag/Nächster Beitrag bedingt generiert, mit der RecordNotFound Ausnahme, was schlecht wäre, weil es eine Ausnahme für den Kontrollfluss verwenden würde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X