在Rails中删除所有记录的RESTful路由



我看到过这个问题,但唯一的答案是建议创建一个自定义路由,我不愿意这样做。使用Rails的默认RESTful路由有哪些替代方案?

特别地,我已经开始使用这种设置:

# routes.rb
# Note the singular resource
resource :all_apples, path: 'apples/all', only: :destroy
# all_apples_controller.rb
class AllApplesController
def destroy
# Something like:
User.find(params[:id]).apples.delete_all
end
end

然后我可以执行DELETE /apples/all来删除所有apple记录。我还将有一个单独的ApplesController与标准的个人CRUD操作,所以我仍然可以做,例如,GET /apples

这是一个"rest"吗?如何解决这个问题?有什么值得注意的问题吗?

注意

我的实际用例与令牌撤销有关。我想要一个端点,撤销所有用户的网络令牌。我目前使用DELETE /users/:id/tokens/all,如上所述。

我一直在想这件事。我真的不喜欢在控制器上做这样的事情。

  1. 我会为用户创建一个特殊的嵌套路由
# config/routes.rb
resources :users do
delete '/delete_all_apples', to: 'users#delete_all_apples'
end

现在我们有一个特殊的路径来删除用户中的所有苹果

在控制台上,你可以像这样找到这些路由

rails routes | grep delete_all_apples
# user_delete_all_apples DELETE     /users/:user_id/delete_all_apples(.:format)                                                       users#delete_all_apples
  1. 在你的视图中你的链接应该是
<%= link_to 'Destroy All Apples', user_delete_all_apples_path(user.id), data: {:confirm => 'Are you sure?'}, :method => :delete %>
  1. 您的控制器
class UsersController  < ApplicationController
def delete_all_apples
User.find(params[:id]).delete_all_apples
end
end
  1. 在你的模型
class User < ActiveRecord::Base
has_many :apples
def delete_all_apples
apples.delete_all
end
end

最新更新