Auf die Implementierung einer RESTful-Ressourcen für eine state-machine oder endliche Automaten
Ich bin ein Rails und REST-Neuling und ich bin dabei, zu überlegen, wie man am besten setzen Sie eine Ressource, die gesichert durch ein domain-Objekt, das über eine state machine (in anderen Worten eine endliche Automaten).
Ich habe gesehen, eine Reihe von Edelsteinen, die für ein Modell der Klasse a state machine, wie aasm, übergänge, workflow -, aber keiner von Ihnen Dokument Beispiele, wie Sie tatsächlich verwendet werden in einem Ressourcen-orientierten Steuerung. Sie alle scheinen zu implizieren, dass die Zustandswechsel werden ausgelöst durch ein "Ereignis" , das ist wirklich ein Aufruf der Methode. Einige Fragen, die ich mit dem, was das impliziert sind:
- Die update-Aktion (PUT-Methode) ist nicht geeignet, da LEGEN Sie wohl sein idempotent. Nur wäre dies möglich ist, wenn der Staat gesendet wurde, als Teil der Repräsentation. Dies ist inconsistet mit einem "event". Ist das richtig?
- Da, Ereignisse sind nicht idempotent, dann ist das ein POST benutzt werden muss. Aber, auf welche Ressource? Gibt es eine subresource für jedes mögliche Ereignis? Oder gibt es jemanden (/updatestate), dass dauert so seine Darstellung die Ereignis-trigger und alle Parameter, die das Ereignis?
- Da der Zustand der Ressource geändert wird, die durch ein Ereignis ausgelöst möglicherweise durch ein anderes Mittel, sollte die create-Aktion akzeptieren Sie änderungen an der state-Attribut (oder andere Attribute, die davon abhängig sind die state machine)?
- [Letzte Frage] Was ist ein guter Weg, um zu entlarven, die übergänge in der Benutzeroberfläche? Denn die Ereignisse sind nicht Staaten, es scheint, dass es nicht sinnvoll ist, zu ermöglichen, das state-Attribut (und jedem anderen Attribut abhängig ist Zustandsübergänge) aktualisiert werden. Bedeutet das, dass diese Attribute ignoriert werden sollen, die in der update-Aktion?
- Mein Rat: fahren Sie nicht selbst verrückt zu versuchen zu befriedigen, der REST der Trolle mit 100% so genannten RESTfulness. REST ist ein praktisches Werkzeug für die Gestaltung einer API, aber die meisten komplexen APIs sind gezwungen, Pause, REST, besonders SETZEN idempotenz.
- Es gibt viele Ebenen von RESTfulness es scheint, zumindest aber die Einhaltung der Grundregeln: GET/PUT/DELETE für idempotent, POST für nicht-idempotenten HTTP-Fehlercodes für Fehler, Hinweise, subresources beschrieben, die von übergeordneten Ressourcen. Das sind die (relativ) einfache Teile zu.
- REST troll hier: Wenn Sie nicht Folgen Sie den weiteren Einschränkungen nennen Sie es nicht Erholsamen aber RESTlike 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Richtig.
Können Sie tun es in beide Richtungen. Sie können sowohl in der gleichen Anwendung, mit der Veränderung in der event-Typen ermittelt werden, indem entweder das eingehende Dokument oder der empfangenden Ressource. Persönlich würde ich es vorziehen, es zu tun, der durch unterschiedliche Dokument-Typen, aber das ist nur meine Meinung. Wenn Sie tun gehen, die mehrere Ressourcen route, stellen Sie sicher, Sie sind sichtbar (D. H., indem links zu jedem von Ihnen beschrieben, in das Dokument zurückgegeben, wenn Sie deren übergeordnete Ressource).
Bis zu Ihnen; es gibt keinen wirklichen Grund, warum man Besondere Aufmerksamkeit auf bestimmte attribute bei der Erstellung. (Man kann dies rationalisieren, indem Sie sagen, dass der Status ändert, um zu einem richtigen Initialen Zustand der Zustandsmaschine unmittelbar nach der Erstellung.) In der state-machines, die ich getan habe wurde die Kreation durch einen POST sowieso (und von einer anderen – ziemlich komplexe – Dokument), so war die ganze Sache strittig, aber wenn Sie es erlauben, mehrere anfangszustände dann macht es Sinn, eine "dies ist meine bevorzugte Start-Zustand" - Hinweis in der Schöpfung dokumentieren. Um klar zu sein, nur weil der Benutzer will, bedeutet nicht, Sie müssen es tun, ob Sie wollen, beschweren sich die user wenn Sie ablehnen, einen Vorschlag von Ihnen ist, Ihren Anruf.
[Lager Antwort.]
Ein wenig spät zur party hier, aber ich war die Erforschung genau dieses Problem für mich selbst und fand, dass der Edelstein ich bin derzeit mit verwalten meine state machines (state_machine von pluginaweek) hat einige Methoden, die sich mit diesem Problem sehr schön.
Wenn verwendet mit ActiveRecord (und ich gehe davon aus anderen Persistenz-Schichten als auch), es bietet eine
#state_event=
- Methode akzeptiert eine Zeichenfolge Darstellung der Veranstaltung, die Sie möchten, um das Feuer. Siehe Dokumentation hier.Diese können Sie einfach fügen Sie eine
state_event
Feld in Ihrem Ressource Bearbeiten Sie Formulare und erhalten Sie die Zustandsübergänge so einfach wie die Aktualisierung von jedem anderen Attribut.Nun sind wir offensichtlich immer noch mit PUT-trigger-Ereignisse mit dieser Methode, und die ist nicht Erholsam. Die gem bietet aber eine ein Interessantes Beispiel, dass zumindest "fühlt" sich ganz Ruhig, obwohl es mit dem gleichen nicht-Erholsamen-Methode unter der Decke.
Wie Sie sehen können hier und hier, die gem Introspektion Fähigkeiten können Sie in Ihrem Formen entweder in der Veranstaltung, die Sie möchten, um das Feuer oder den Namen dieses Ereignis resultierenden Zustand.
Diese Technik, erhalten Sie einfach die Formular-basierte Aktualisierung der Modell-Status keine gültigen nächste Staat, ohne zu schreiben zusätzlichen code. Es ist technisch nicht Erholsam ist, aber es erlaubt Ihnen, leicht zu präsentieren, dass die Art und Weise, in der UI.
Die Sauberkeit dieser Technik kombiniert mit der inhärenten Konflikte und versuchen, die Umwandlung ein event-based state-Maschine, die in einem einfachen RESTful-Ressourcen war genug, um mich, so dass ich hoffe, es bietet einige Einblicke, um Sie als gut.
state_event
Methode. Aber darf ich aufgetreten, eine Einschränkung dieser Technik. Sie können keine Argumente übergeben werden, um den übergang Ereignis, wenn Sie es auslösen mit derstate_event
Methode. Das bedeutet, dass Sie nicht aufnehmen kann Informationen wie diecurrent_user
wer das Ereignis ausgelöst hat (wie dieses: stackoverflow.com/a/6347369/574190).Bisschen spät zu der party hier und weit entfernt von einem Experten, denn ich habe eine ähnliche Anfrage, aber...
Wie sieht es damit aus der Veranstaltung eine Ressource?
Also statt...
Würden Sie...
Mit pub/sub Hörer zwischen Bestellung und OrderEvent oder Rückruf, der versucht, Feuer-event auf, Um und zeichnet den übergang von Nachrichten. Es gibt Ihnen auch eine praktische Prüfung von allen staatlichen change-Ereignisse.
Idee gestohlen Willem Bergen auf Shopify
Bin ich etwas fehlt? Sorry, kämpfen, um das zu verstehen, mich.
Wenn Ihr Ressource hat eine Art status-Attribut können Sie verwenden eine Technik namens micro-PUT zum aktualisieren den status.
Können Sie modellressource Staaten als Sammlungen und verschieben von Ressourcen zwischen diesen Sammlungen.
Konnten Sie immer die Verwendung der neuen PATCH-Methode