Frage

Ich kenne also, dass die Unterscheidung zwischen dem Knall (Ausrufezeichen) und Nicht-Bang-Methoden normalerweise festgestellt wird, ob die Methode das Objekt selbst ändert oder ein separates geändertes Objekt zurückgibt, das das Original unverändert hält.

Während ich das Benutzermodell in Kapitel 6 des Buches erstellte, stieß ich auf die User.create Methode, die ein neues Modell erstellt und es in einem einzigen Schritt in der Datenbank speichert. In Michael Hartl's Ruby on Rails 3 Tutorial, er schreibt, dass die User.create! Methode "funktioniert genauso wie die create Methode ... außer dass es eine auslöste ActivereCord :: Record-Invalid Ausnahme, wenn die Schöpfung fehlschlägt. "

Ich bin ziemlich verwirrt. Ist der User.create! Methode, Ruby nicht "Bang-Convention" zu folgen, oder fehlt mir etwas völlig? Und wenn er der Konvention folgt, wie geht es dann? User.create! Ändern Sie das Selbst, wenn es sich um eine Klassenmethode handelt?

War es hilfreich?

Lösung

Obwohl viele Klassen Bang -Methoden als "eine Methode, die das an Ort und Stelle veränderte Objekt verändert" behandeln, mag ich die Beschreibung von Bang -Methoden aus dem Eoquent Ruby Book besser:

In der Praxis reservieren Ruby -Programmierer! Die Namen von Methoden schmücken, die etwas Unerwartetes oder vielleicht etwas Gefährliches tun

In diesem Fall ist das "unerwartete" Ergebnis, dass eine Ausnahme anstatt nur zu scheitern und zurückzukehren false.

Andere Tipps

Hoffe das hilft auch:

Die Bang -Versionen (zB Save!) Erhöhen eine Ausnahme, wenn der Datensatz ungültig ist. Die Nicht-Bang-Versionen nicht: Speichern und update_attributes zurückgeben, erstellen und aktualisieren Sie einfach die Objekte zurück.

Quelle: http://edgeguides.rubyonrails.org/active_record_validations.html#When-does-validation-happen-questionmark

Bearbeiten: Quelle geändert, um den kaputten Link zu beheben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top