实现RESTful切换操作的最佳方法是什么?

Jon*_*tan 14 rest ruby-on-rails

我正在重写一个旧的Rails应用程序,我认为我应该以RESTful方式进行,作为一种学习经验,如果没有别的.

我已经达成了一些切换布尔值的操作,例如,如果文章是否已发布.

在我做了几个动作之前:toggle_published,发布和取消发布.

它们非常易于使用:我只是在文章列表中链接到它们.

你会如何以RESTful方式做同样的事情?

我应该使用update-action,并构建一个迷你表单来替换之前使用的每个链接吗?我并不特别喜欢这个想法.

Van*_*orn 33

只是一个通知:

切换方法不是RESTful,因为HTTP PUT动词应该是幂等的(参见http://en.wikipedia.org/wiki/Idempotence#Examples).这意味着无论您多久执行一次方法,它都应该始终给出相同的结果.切换方法不遵循此原则,因为如果执行一次与执行两次相比,它不会产生相同的结果.

如果你想使它成为RESTful,你应该创建两个方法:一个用于设置,一个用于取消设置.

使应用程序RESTful不仅意味着您应该使用正确的HTTP动词.


Chr*_*ola 13

我可能在嵌套的"切换资源"上使用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)
Run Code Online (Sandbox Code Playgroud)

可能看起来有点奇怪,但它在技术上是RESTful.

更新:一种(也许)更自然的方法也可能只是:

PUT or POST /articles/:id/published Data: { state: true/false } # Toggle published ON
Run Code Online (Sandbox Code Playgroud)

您也可以将PATCH动词与我认为具有published属性的实际文章一起使用:

PATCH /articles/:id { published: true/false }
Run Code Online (Sandbox Code Playgroud)

因为现在所有酷孩子都在使用PATCH.


Win*_*eld 2

听起来您有两个用例:

  • 设置发布状态
  • 切换发布状态

您应该能够为以下内容的切换操作添加成员路由:

/articles/<id>/toggle_published - calls Article.toggle(:published)
Run Code Online (Sandbox Code Playgroud)

并通过标准 REST 资源路由对 :published 属性使用文章更新。

map.resources :articles, :member => :toggle
Run Code Online (Sandbox Code Playgroud)