Rails 3 routing - :delete方法on:collection

Laa*_*aas 12 routing ruby-on-rails-3

我想创建一个允许删除所有的路由shares.RESTful方式是使用动词DELETE.如何创建指向以下内容的路由:

DELETE /shares
Run Code Online (Sandbox Code Playgroud)

我尝试过这些路线:

resources :shares do
  delete :on => :collection
end
Run Code Online (Sandbox Code Playgroud)

但这产生了一个错误,铁轨不能nil变成一个符号.

现在我有:

resources :shares do
  delete 'delete_all', :on => :collection
end
Run Code Online (Sandbox Code Playgroud)

编辑:我有一个控制器动作名称的拼写错误,后一种方式工作,但产生的URL /shares/delete_all不是很RESTful.

如何删除_delete_all_部分?

MDa*_*lke 14

对于Rails 3,你可以这样做,并分别有指向index和delete_all的资源丰富的GET/DELETE集合操作:

resources :shares do
  delete :index, on: :collection, action: :delete_all
end
Run Code Online (Sandbox Code Playgroud)

如果您正在使用Rails 4,您可以利用关注点来干掉它并将其应用于许多资源:

concern :deleteallable do
  delete :index, on: :collection, action: :delete_all
end

resources :shares, concerns: :deleteallable
resources :widgets, concerns: :deleteallable
Run Code Online (Sandbox Code Playgroud)


col*_*oss 7

我错过了什么?

match 'shares', :to => 'shares#delete_all', :via => :delete
Run Code Online (Sandbox Code Playgroud)

更多信息:http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/

<subjective opinion> 这通常是一个坏主意和代码/设计气味.需要通过RESTful接口删除所有记录应该真正在受保护(经过身份验证)的操作后面和/或操作应该以某种方式限定给用户.

  • 他的问题或答案中没有任何内容要求所有共享的删除方法不需要身份验证,或者不需要授权.在实际执行您要求的操作之前,您永远无法从路由中判断某个操作是否检查了正确的授权. (3认同)