首页 > 解决方案 > 用于删除外键的 RESTFUL 端点

问题描述

我有一个 Rails API。在 REST API 中删除外键的常见做法(路由和控制器操作)是什么?我的意思是不删除任何资源,只是将外键设置为null一对一的关系。

例如,我有一辆车,而这辆车有一个客户。

如果我要删除客户,它将是:

DELETE /vehicles/:id/customer

如果我只想vehicle_id: null在客户身上设置我应该使用什么端点和控制器?

标签: ruby-on-railsrubyrestapiroutes

解决方案


我不知道常见的做法是什么,但你可以设置你的routes.rb东西:

Rails.application.routes.draw do

  ...

  resources :customers do 
    resources :vehicles, shallow: true
    member do
      put :remove_vehicle
    end
  end

  ...

end

这会给你类似的东西:

      customer_vehicles GET    /customers/:customer_id/vehicles(.:format)           vehicles#index
                        POST   /customers/:customer_id/vehicles(.:format)           vehicles#create
   new_customer_vehicle GET    /customers/:customer_id/vehicles/new(.:format)       vehicles#new
           edit_vehicle GET    /vehicles/:id/edit(.:format)                         vehicles#edit
                vehicle GET    /vehicles/:id(.:format)                              vehicles#show
                        PATCH  /vehicles/:id(.:format)                              vehicles#update
                        PUT    /vehicles/:id(.:format)                              vehicles#update
                        DELETE /vehicles/:id(.:format)                              vehicles#destroy
remove_vehicle_customer PUT    /customers/:id/remove_vehicle(.:format)              customers#remove_vehicle
              customers GET    /customers(.:format)                                 customers#index
                        POST   /customers(.:format)                                 customers#create
           new_customer GET    /customers/new(.:format)                             customers#new
          edit_customer GET    /customers/:id/edit(.:format)                        customers#edit
               customer GET    /customers/:id(.:format)                             customers#show
                        PATCH  /customers/:id(.:format)                             customers#update
                        PUT    /customers/:id(.:format)                             customers#update
                        DELETE /customers/:id(.:format)                             customers#destroy

在这种情况下,您将向remove_vehicle您的CustomersController. 在该操作中,您将params[:id]可以使用它来查找您的@customer操作,然后执行以下操作:

class CustomersController < ApplicationController

  ...

  def remove_vehicle
    @customer = Customer.find(params[:id])
    @customer.update(vehicle_id: nil)
    redirect_to :somewhere
  end

  ...

end

推荐阅读