2010-07-16 20 views
7

Ich schreibe eine alte Rails-Anwendung neu und ich dachte, ich sollte es in einer RESTful Weise tun, als eine Lernerfahrung, wenn nichts anderes.Der beste Weg, um eine RESTful Toggle-Aktion zu implementieren?

Ich habe einige Aktionen erreicht, die einen booleschen Wert umschalten, zum Beispiel wenn ein Artikel veröffentlicht wird oder nicht.

Bevor ich ein paar Aktionen hatte: toggle_published, publish und unpublish.

Sie waren sehr einfach zu bedienen: Ich habe nur einen Link zu ihnen in der Artikel-Liste.

Wie würden Sie das Gleiche in einer RESTful Manier machen?

Soll ich die update-action verwenden und ein Mini-Formular erstellen, um jede zuvor verwendete Verbindung zu ersetzen? Ich mag diese Idee nicht besonders.

Antwort

0

Es klingt wie Sie zwei Fällen Gebrauch haben:

  • Set veröffentlicht Zustand
  • Toggle veröffentlicht Zustand

Sie sollten für ein Mitglied Route für die Toggle-Aktion hinzufügen können:

/articles/<id>/toggle_published - calls Article.toggle(:published) 

Und verwenden Artikel Update auf: veröffentlicht Attribut über die Standard-REST r Esourroute.

map.resources :articles, :member => :toggle 
23

Nur ein Hinweis:

Eine Toggle-Methode nicht RESTful ist, weil das HTTP PUT Verb sein sollte idempotent (siehe u.a. http://en.wikipedia.org/wiki/Idempotence#Examples). Dies bedeutet, dass Sie unabhängig davon, wie oft Sie eine Methode ausführen, immer das gleiche Ergebnis liefern sollten. Eine Toggle-Methode hält sich nicht an dieses Prinzip, da es nicht das gleiche Ergebnis liefert, wenn Sie es einmal ausführen und es zweimal ausführen.

Wenn Sie es RESTful machen möchten, sollten Sie zwei Methoden erstellen: eine für die Einstellung und eine für die Unscharfschaltung.

Eine Anwendung RESTful zu machen bedeutet nicht nur, dass Sie das korrekte HTTP-Verb verwenden.

9

Ich würde es wahrscheinlich mit PUT/DELETE oder POST/DELETE auf einer verschachtelten "Toggle-Ressource" lösen. Vielleicht nicht 100% völlig erholsam, aber sicherlich leicht genug zu verstehen.

PUT or POST /articles/:id/published # Toggle published ON 

DELETE /articles/:id/published # Toggle published OFF 

GET /articles/:id/published # Get state RESTfully via status 200 (ON) or 404 (OFF) 

Scheint ein bisschen seltsam, aber es ist technisch RESTful.

Update: A (vielleicht) natürlicheren Ansatz könnte auch sein, nur:

PUT or POST /articles/:id/published Data: { state: true/false } # Toggle published ON 

Sie auch die PATCH Verb mit dem eigentlichen Artikel verwenden könnte, die ich davon ausgehen, hat eine published Eigenschaft:

PATCH /articles/:id { published: true/false } 

Weil all die coolen REST Kids heutzutage PATCH benutzen.

Verwandte Themen