2010-07-16 34 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。