In meinem aktuellen Rails-Programm, wenn ich so etwas benutze
user = User.find(10)
Wenn es keinen Benutzer mit ID = 10 gibt, habe ich eine Ausnahme wie:
ActiveRecord::RecordNotFound: Couldn't find User with ID=10
Kann ich Null bekommen, anstatt eine Ausnahme auszulösen, wenn ich so etwas mache wie:
unless user = Challenge.find(10)
puts "some error msg"
end
Ich möchte nur Null bekommen, wenn es keine Aufzeichnungen gibt, und ich möchte nicht Start / Rettung verwenden
Vielen Dank
Antworten:
Ja, mach einfach:
Für Schienen 4 und 5:
quelle
.find_by_*
Null zurückkehren würden und die.find
nicht.Something.find_by(id: x)
eine SQL-Anweisung mit allen Attribut / Wert-Paaren des Hashs als Teil der WHERE-Klausel erstellt wird. Sieht für mich wie ein Rails-Bug aus.find_by_...
Finder für jedes Attribut, das ein Modell enthält:id
. Sollte alsoChallenge.find_by_id(10)
unabhängig von der Rails-Version funktionieren.Challenge.find(10) rescue nil
In Rails 4 wurden dynamische Finder - wie
find_by_id
sie in der akzeptierten Antwort verwendet wurden - nicht mehr unterstützt.In Zukunft sollten Sie die neue Syntax verwenden:
quelle
Challenge.find_by(id: 10)
ist die andere Art, dies zu schreibenSie können dies ein bisschen hackisch machen, verwenden Sie einfach die ActiveRecord Query Interface.
Dies gibt null zurück, anstatt eine Ausnahme auszulösen
quelle
find_by_id
ist, dass es von Schienen 3 bis 4 tragbar ist. In Schienen 4 ist esfind_by(:id => 10)
.Warum fängst du nicht einfach die Ausnahme? Ihr Fall sieht genau so aus, für welche Ausnahmen gemacht wurde:
Wenn Sie den Fehler im Rettungsblock beheben möchten (z. B. durch Festlegen eines Platzhalterbenutzers (Nullmuster)), können Sie mit Ihrem Code unter diesem Block fortfahren. Andernfalls können Sie einfach Ihren gesamten Code für den "glücklichen Fall" in den Block zwischen "beginnen" und "retten" einfügen.
quelle
begin…end
Block nicht einmal , wenn Sie bereits einen Block wie eine Controller-Methode haben. In diesem Fall ist die einzige zusätzliche Leitung, die Sie benötigen, dierescue
Leitung. Viel eleganter und einfacher zu handhaben alsnil
mit einerif
Aussage zu prüfen .Sie können dies versuchen
Challenge.exists?(10)
quelle
Für diejenigen, die mit Mongoiden zu kämpfen haben , stellt sich heraus, dass sowohl
find
als auchfind_by
Methoden Ausnahmen auslösen - unabhängig von Ihrer Rails-Version!Es gibt eine Option ( raise_not_found_error ), die auf false gesetzt werden kann, aber wenn falsey eine
find
Methode ausführt, wird auch keine Ausnahme ausgelöst .Daher ist die Lösung für mongoide Benutzer der widerliche Code:
quelle
.where(email: params[:email]).first
für mich.rescue
genauso einfach wie:
quelle
if user...else
Sie können find_by mit dem erforderlichen Attribut (in Ihrem Fall der ID) verwenden. Dies gibt nil zurück, anstatt einen Fehler auszugeben, wenn die angegebene ID nicht gefunden wird.
oder Sie könnten das neue Format verwenden:
Sie können auch where verwenden, aber Sie müssen wissen, dass where eine aktive Datensatzbeziehung mit null oder mehr Datensätzen zurückgibt, die Sie zuerst verwenden müssen, um nur einen Datensatz oder null zurückzugeben, falls null Datensätze zurückgegeben werden.
quelle