从Rails API的卷曲命令基于谓词从DELETE删除?

时间:2019-06-30 13:20:19

标签: ruby-on-rails curl ruby-on-rails-5

我可以从here看到如何通过ID删除表记录

即这将删除ID = 1的用户记录

curl -X DELETE "http://localhost:3000/users/1"

但是,如果我想删除基于其他内容的记录,例如所有使用name: "John"的用户,如何通过curl命令来实现?

更新:我以为curl -X DELETE -d "name=John" "http://localhost:3000/users"可以工作,但是不行

1 个答案:

答案 0 :(得分:3)

在这种情况下,API会有所变化。 Rails上默认DELETE API的路由要求将ID作为输入强制传递。请求格式为some_api/:id。但是,对于您的用例,您将需要一个不同的API,该API不需要强制将ID作为输入。它可能是一个多用途的API,可以按名称,ID等删除。例如:

# app/controllers/users_controller.rb
def custom_destroy
  @users = User.filtered(filter_params)
  @users.destroy_all
  <render your response>
end

def filter_params
  params.permit(:id, :name, <Any other parameters required>)
end

# app/models/user.rb
scope :filtered, -> (options={}) {
  query = all
  query = query.where(name: options[:name]) if options[:name].present?
  query = query.where(id: options[:id]) if options[:id].present?
  query
}

其路线可描述为:

resources :users do
  collection do
    delete :custom_destroy
  end
end

这将导致路由:localhost:3000/users/custom_destroy,可以通过DELETE动作来调用。即

curl -X DELETE "http://localhost:3000/users/custom_destroy?name=John"