2010-07-16 18 views
7

Sto facendo una riscrittura di una vecchia applicazione Rails e ho pensato che avrei dovuto farlo in modo RESTful, come esperienza di apprendimento se non altro.Il modo migliore per implementare un'azione di commutazione RESTful?

Ho raggiunto alcune azioni che commutano un valore booleano, ad esempio se un articolo è pubblicato o meno.

Prima ho avuto un paio di azioni: toggle_published, pubblicare e annullare la pubblicazione.

Sono stati molto facili da usare: ho appena creato un collegamento a loro nella lista degli articoli.

Come faresti la stessa cosa in modo RESTful?

Devo utilizzare l'aggiornamento-azione e creare un mini-modulo per sostituire ogni collegamento che ho usato in precedenza? Non mi piace particolarmente quell'idea.

risposta

0

Sembra che si hanno due casi d'uso:

  • impostare lo stato pubblicato
  • ginocchiera pubblicato stato

Si dovrebbe essere in grado di aggiungere un percorso membro per l'azione di commutazione per:

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

E utilizzare l'aggiornamento articolo su: attributo pubblicato tramite REST standard r esource route.

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

Solo un avviso:

Metodo di commutazione non è RESTful, perché il verbo HTTP PUT dovrebbe essere idempotente (vedi A.O. http://en.wikipedia.org/wiki/Idempotence#Examples). Ciò significa che non importa quanto spesso si esegue un metodo, dovrebbe sempre dare lo stesso risultato. Un metodo di commutazione non rispetta questo principio, in quanto non fornisce lo stesso risultato se lo si esegue una volta confrontato con l'esecuzione due volte.

Se si desidera renderlo RESTful, è necessario creare due metodi: uno per l'impostazione e uno per l'annullamento.

Fare un'applicazione RESTful non significa solo che è necessario utilizzare il verbo HTTP corretto.

9

Probabilmente lo risolvo con PUT/DELETE o POST/DELETE su una "toggle resource" annidata. Forse non al 100% completamente riposante ma certamente abbastanza facile da capire.

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) 

Potrebbe sembrare un po 'strano, ma è tecnicamente RESTful.

Update: A (forse) l'approccio più naturale potrebbe anche essere solo:

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

si potrebbe anche utilizzare il PATCH verbo con l'articolo vero e proprio, che presumo ha una proprietà published:

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

Al giorno d'oggi tutti i ragazzi REST stanno usando PATCH.

Problemi correlati