Frage

Nach der Zerstörung einer Ressource in meiner Rails-Anwendung, die Benutzer können es wiederherstellen, klicken auf einen link.

Derzeit wird diese wiederherstellen-Aktion weitergeleitet, um die destroy-Methode der entsprechenden Ressource-controller.

Bei dieser Methode findet die Ressource in der Datenbank, es zerstört und bewegt sich der Datensatz in einer trash-Tabelle.

Wenn Sie nicht finden, die Ressource in der Datenbank, sucht Sie es in den Papierkorb Tisch und wenn es feststellt, dass die Ressource wieder.

Ich bin nicht sehr zufrieden mit dieser Art zu tun, mit der destroy-Methode mit zwei Zwecke:zerstören und wiederherstellen.

Ich könnte eine engagierte wiederherstellen-Aktion in meinem controller, aber in einem anderen Weg, wo würden Sie den restore request-Verarbeitung?In einem dedizierten controller?Wenn ja, mit welcher Methode, PUT oder POST?

War es hilfreich?

Lösung

POST ist nicht idempotent, d.h., wenn Sie senden die gleiche POST-Anforderung mehrmals, erhalten Sie viele neue Artikel.PUT idempotent sein muss, da das update geschieht auf die gleiche Ressource sollte haben keine Nebenwirkungen, wenn es mehrfach ausgeführt wird.

Was diese Aktion sollte gehen, es hängt wirklich von Ihrer ästhetischen sensibilty und wie hart Sie sein wollen, über REST-versus-halten Sie Ihre Rails-Controller sauber und gut organisiert.

Es ist sicherlich fraglich, dass ein DeletedBob ist, die unterschiedliche Ressourcen aus einem Bob.Man könnte sagen, dass eine PUT gesendet, um die DeletedBobsController wäre update die DeletedBob Ressource, vielleicht mit einem parameter wie "deleted= "false" angeben, der Zweck des Updates.

Sie könnte auch betrachten Löschungen als Ressource.Dann können Sie mit LÖSCHEN auf der DeletionsController mit den params "resource_type=bob&resource_id=23".Durch die Zerstörung der Löschung, werden Sie die Wiederherstellung des ursprünglichen Objekts.Nachfolgende identisch Anrufe wird die Ausbeute ein "Objekt nicht gefunden" - Fehler, wie man erwarten würde, mit LÖSCHEN.

Persönlich, seit Roy Fielding (ursprünglicher Autor der dissertation definieren von REST -) kam heraus und sagte, dass es wirklich nichts falsch mit der POST, Ich würde überlegen, die Definition einer zusätzlichen :put => :restore Methode und route auf meinem BobsController.Es hält den code, wo ein anderer Programmierer es erwarten würden, und Sie sind wahrscheinlich die einzige Publikum für diese Art von design.

Andere Tipps

Ich denke, ein REST würden Puristen erstellen Sie eine neue Ressource namens " Papierkorb die ist verarbeitet durch eine TrashController.Verarbeiten, wiederherstellen, Sie würde haben eine Aktion auf TrashController genannt Wiederherzustellen.

Die URL würde dann so Aussehen:

http://example.com/trash/restore/{resourceId}

Ich denke, da die Aktion auf einer Ressource, die Funktionalität sollte Leben in die ResourceController.Einer meiner arbeiten understadings einer RESTFUL-Architektur ist, dass eine Regel der Daumen auf die Entscheidung zwischen PUT und POST, die POST ist verwendet für erstellt und GESETZT ist verwendet für updates.In diesem Fall würde ich erwarten, dass die Ressource 'existiert' und Sie aktualisieren es Stand, dass Ihre würde verwenden Sie eine PUT-und der restore-URI wäre so etwas wie:

http://example.com/resources/restore/{id}

Ich denke, Sean war auf dem richtigen Weg, aber ich würde es einen Schritt weiter.Stellen Sie den Papierkorb Aktion POST updates der Ressource trash=1.Dann wieder nur ein weiterer POST der gleichen Ressource trash=0

EDIT:Ersetzt falsche Methode PUT mit POST angesichts der Auftrag wird nicht senden die gesamte Ressource, nur ein update von einem Teil der Ressource.

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