2010-07-16 62 views
7

我正在重寫一箇舊的Rails應用程序,我認爲我應該以REST風格的方式來做,如果沒有其他的學習經驗,我會這樣做。實現RESTful切換操作的最佳方式?

我已經達到了一些切換布爾值的操作,例如,如果文章發佈與否。

在我做了一些操作之前:toggle_published,發佈和取消發佈。

他們很容易使用:我只是在文章列表中建立了一個鏈接。

你會如何以REST風格做同樣的事情?

我應該使用update-action並構建一個迷你表單來替換之前使用的每個鏈接嗎?我不特別喜歡這個想法。

回答

0

這聽起來像你有兩個用例:

  • 集出版狀態
  • 切換公佈狀態

您應該能夠添加一個成員路徑的切換動作爲:

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

並使用文章更新:通過標準REST r發佈的屬性資源路線。

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

只是一個通知:

撥動方法沒有RESTful的,因爲HTTP PUT動詞假定爲冪等(見A.O. http://en.wikipedia.org/wiki/Idempotence#Examples)。這意味着不管你多長時間執行一次方法,它總是應該給出相同的結果。切換方法不遵循這個原則,因爲如果您執行一次而不是執行兩次,則不會得到相同的結果。

如果您想使其成爲RESTful,您應該創建兩個方法:一個用於設置,另一個用於取消設置。

製作應用程序RESTful不僅意味着您應該使用正確的HTTP動詞。

9

我可能用嵌套的「切換資源」上的PUT/DELETE或POST/DELETE來解決它。也許不是100%完全安寧,但肯定很容易理解。

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) 

可能看起來有點奇怪,但它在技術上是RESTful。

更新: A(也許)更自然的方法,也可能僅僅是:

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

您也可以使用PATCH動詞與我假設有一個published財產實際的文章:

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

因爲所有酷酷的REST小孩現在都在使用PATCH。